三路快排,堆排序

  1 #include <iostream>
  2 #include <vector>
  3 using namespace std;
  4 
  5 int partition(vector<int> &arry, int lo, int hi);
  6 void qsort(vector<int> &arry, int lo, int hi);
  7 void qsort_3way(vector<int> &arry, int lo, int hi);
  8 void sink(vector<int> &arry, int k);
  9 void heap_sort(vector<int> &arry);
 10 
 11 int main()
 12 {
 13     vector<int> v ={8,-4,-45,-1,-1,-1,-1,12,-12,-12,-12,-56,2,3,-3,-3,3,3,-3};
 14 
 15     //qsort_3way(v, 0, v.size()-1);
 16     heap_sort(v);
 17 
 18     for(auto x:v)
 19         cout<<x<<" ";
 20 
 21     return 0;
 22 }
 23 
 24 void qsort(vector<int> &arry, int lo, int hi)
 25 {
 26     if(lo >= hi)    return;  //递归出口 && 注意是等于
 27 
 28     int j = partition(arry, lo, hi);  //获取j的位置,分区
 29 
 30     qsort(arry, lo, j-1);  //左区分治
 31     qsort(arry, j+1, hi);  //右区分治
 32 }
 33 
 34 int partition(vector<int> &arry, int lo, int hi)
 35 {
 36     int i=lo, j=hi+1;
 37     int base = arry[lo];
 38 
 39     while(true)
 40     {
 41         while( j>lo && base < arry[--j] ); //从后面找比base小的元素
 42     
 43         while( i<hi && base > arry[++i] ); //从前面找比base大的元素
 44 
 45         if(i >= j)    break; //注意是等于号
 46 
 47         swap(arry[i], arry[j]);
 48     }
 49 
 50     swap(arry[lo], arry[j]); //确定j的位置
 51 
 52     return j;
 53 }
 54 
 55 void qsort_3way(vector<int> &arry, int lo, int hi)
 56 {
 57     if(lo >= hi) return;
 58 
 59     int lt=lo, i=lo+1, gt=hi;
 60     int pivot = arry[lo];
 61 
 62     while(i <= gt)
 63     {
 64         if(arry[i]<pivot)
 65             swap(arry[lt++], arry[i++]); //i++, 应为 lt->pivot, 交换后lt++ -> pivot, i++处理新数
 66         else if(arry[i]>pivot)
 67             swap(arry[gt--], arry[i]); //注意i不变,因为从后面换过来,不知道大小
 68         else
 69             i++;
 70     }
 71 
 72     qsort_3way(arry,lo,lt-1);
 73     qsort_3way(arry,gt+1,hi);
 74 }
 75 
 76 
 77 void sink(vector<int> &arry, int k, int N)
 78 {
 79     while( 2*k+1 <= N)
 80     {
 81         int j = 2*k+1;
 82 
 83         if(j<N && arry[j]<arry[j+1])    j++;
 84         
 85         if(arry[k]>=arry[j])    break;
 86 
 87         swap(arry[k], arry[j]);
 88 
 89         k = j;
 90     }
 91 
 92 }
 93 
 94 void heap_sort(vector<int> &arry)
 95 {
 96     int N = arry.size()-1;
 97 
 98     for(int k = N/2; k >=0; k--)
 99         sink(arry,k,N);
100 
101     while(N > 0)
102     {
103         swap(arry[N--], arry[0]);
104         sink(arry,0,N);
105     }
106 
107 }

 

转载于:https://www.cnblogs.com/hertzz/p/8380053.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值