C/C++实现三路快速排序算法原理

 更新时间:2019年05月29日 14:24:34   作者:玉树银花冬飞雪  
这篇文章主要为大家详细介绍了C/C++实现三路快速排序算法原理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

书接上文,上次讲到了双路快速排序,双路快速排序是将等于v(标志数)的数也进行交换,从而避免了在处理有大量重复数据的数组分组时的不平衡。而三路快速排序则是将等于v的数也分成一组,同样可以解决上述问题。其原理如下:

1、采用随机排序的方法将某个数作为分割数,放在数组开头,该数定义为v。将小于v的一段数组开头的数索引定义为lt,将需要遍历的数组的索引定义为i,将小于v的一段数组的索引定义为gt,数组的开头和结尾的索引分别为lr。原理图如下:

2、对索引i进行维护,逐个比较索引i对应的数与v的关系。如果arr[i]<v,那么将arr[i]和arr[lt+1]交换,之后将索引ilt分别向后移动一位。如下图蓝色的e和灰绿色的那块相交换


3、如果arr[i]=v,则将arr[i]纳入等于v的那一部分,之后将索引i向后移动一位

4、如果arr[i]>v,则将arr[i]与arr[gt-1]交换位置,之后将索引gt向前移动一位,但是要注意,这时,索引i不需要移动,因为交换过来的数不知道大小,下一步还需要接着判断。

5、按照这个流程,gt会和i重合,则结束比较的过程

6、最后,不要忘了将arr[l]和arr[lt]交换位置,注意:这里交换位置的是arr[lt]。排序完成

代码如下:

#ifndef QUICKSORT3_H
#define QUICKSORT3_H
//三路快速排序算法
#include <iostream> 
#include <stdlib.h>

using namespace std;

template <typename T>
void __QuickSort3way(T *arr,int l,int r)
{
 //递归的终止条件
 if (l>=r) 
 {
 return;
 }
 else
 {
 //随机快速排序选取的随机值,为了避免在整体大致有序的情况下产生分组不平衡现象,使算法退化
 int RAND = (rand() % (r - l) + l);
 swap(arr[l], arr[RAND]);
 T v = arr[l];
 //小于v的分组的初始索引
 int lt = l;
 //大于v的分组的初始索引
 int gt = r + 1;
 //等于v的分组的初始索引,并且,此索引是数组遍历值的索引
 int i = l + 1;
 while (i<gt)
 {
  //如果遍历的数据小于v
  if (arr[i]<v)
  {
  //将该数组与第一个等于v的数据交换
  swap(arr[lt + 1], arr[i]);
  //维护小于v的索引和待遍历的数据的索引
  lt++;
  i++;
  }
  //如果数据大于v
  else if (arr[i]>v)
  {
  //交换该数与大于v的第一个数,但是在这里不需要维护i的索引
  swap(arr[i], arr[gt - 1]);
  gt--;
  }
  else//arr[i]==v
  {
  i++;//直接维护i的索引
  }
 }
 //最后将数组第一个数v和小于v的最后一个数互换
 swap(arr[l],arr[lt]);

 __QuickSort3way(arr,l,lt);
 __QuickSort3way(arr,gt,r);
 }
}

template <typename T>
void QuickSort3way(T *arr,int n)
{
 __QuickSort3way(arr, 0, n - 1);
}

#endif // !QUICKSORT3_H

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 为什么说C语言是永不过时的语言

    为什么说C语言是永不过时的语言

    时隔5年,C语言再次领先Java,荣登TIOBE编程语言排行榜第一,那么C语言为何不会过时?你需要掌握多少种语言呢,感兴趣的朋友通过本文一起学习下吧
    2020-11-11
  • C语言实现学生宿舍信息管理系统

    C语言实现学生宿舍信息管理系统

    这篇文章主要为大家详细介绍了C语言实现学生宿舍信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 理解数据结构

    理解数据结构

    本文是对数据结构对编程的重要性,数据结构对数据存储,数据处理,内存工作,从宏观上理解数据结构
    2016-07-07
  • 面试题快慢链表和快慢指针

    面试题快慢链表和快慢指针

    这篇文章主要介绍了面试题快慢链表和快慢指针的相关资料,需要的朋友可以参考下
    2017-06-06
  • C++中priority_queue的使用与模拟实现

    C++中priority_queue的使用与模拟实现

    本文主要介绍了C++中priority_queue的使用与模拟实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • C语言实现随机发扑克牌

    C语言实现随机发扑克牌

    这篇文章主要为大家详细介绍了C语言实现随机发扑克牌,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C语言数独游戏的求解方法

    C语言数独游戏的求解方法

    这篇文章主要为大家详细介绍了C语言数独游戏的求解方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • 基于结构体与指针的详解

    基于结构体与指针的详解

    本篇文章是对结构体与指针进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 枚举窗口句柄后关闭所有窗口示例

    枚举窗口句柄后关闭所有窗口示例

    这篇文章主要介绍了关闭所有窗口的方法,原理是枚举所有窗口句柄,然后发送WM_CLOSE消息来关闭窗口,需要的朋友可以参考下
    2014-01-01
  • C语言数据结构之栈和队列的实现及应用

    C语言数据结构之栈和队列的实现及应用

    栈和队列是一种数据结构,只规定了性质,并没有规定实现方式。本文将以顺序结构实现栈,链表方式实现队列,感兴趣的小伙伴快跟随小编一起学习一下吧
    2022-08-08

最新评论