码迷,mamicode.com
首页 > 编程语言 > 详细

三路快排,堆排序

时间:2018-01-30 12:49:28      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:分区   堆排序   ret   wap   ++   注意   namespace   大小   获取   

  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 }

 

三路快排,堆排序

标签:分区   堆排序   ret   wap   ++   注意   namespace   大小   获取   

原文地址:https://www.cnblogs.com/hertzz/p/8380053.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!