C/C++实现三路快速排序算法原理-创新互联

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

成都创新互联专注为客户提供全方位的互联网综合服务,包含不限于网站设计制作、成都网站建设、华亭网络推广、成都微信小程序、华亭网络营销、华亭企业策划、华亭品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们大的嘉奖;成都创新互联为所有大学生创业者提供华亭建站搭建服务,24小时服务热线:18980820575,官方网址:www.cdcxhl.com

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

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

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

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

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

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

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

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

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

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

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

代码如下:

#ifndef QUICKSORT3_H
#define QUICKSORT3_H
//三路快速排序算法
#include  
#include 

using namespace std;

template 
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 (iv)
  {
  //交换该数与大于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 
void QuickSort3way(T *arr,int n)
{
 __QuickSort3way(arr, 0, n - 1);
}

#endif // !QUICKSORT3_H

另外有需要云服务器可以了解下创新互联建站www.cdcxhl.com,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


当前题目:C/C++实现三路快速排序算法原理-创新互联
本文网址:http://hbruida.cn/article/deicjs.html