C/C++实现三路快速排序算法的原理是什么
创始人
2024-12-21 09:21:51
0次

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

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

2、对索引i进行维护,逐个比较索引i对应的数与v的关系。如果arr[i]i和lt分别向后移动一位。如下图蓝色的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 #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

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...