排序-quicksort
快速排序是20世纪十大算法之一。
思路如下:
- 先随机选取一个切分元素。
- 同时从数组左侧向右(过程a),从右向左依次遍历(过程b)。
- 在a中遇到比切分元素大的元素(i),结束a。在b中遇到比切分元素小的元素(j),结束b。然后交换i,j 位置。
- 继续执行第二步。直到第三步中的i=j,退出第二步执行。
- 交换j和切分元素的位置。
- 将数组从j的位置分割为两部分,每一部分再次执行1-5步。
代码如下:
1 #include <iostream> 2 3 using namespace std; 4 5 void change(int *p,int pos1,int pos2); 6 void quickSort(int *p,int begin,int end); 7 void print(int *p,int length); 8 int partition(int *p,int left,int right); 9 10 int main() 11 { 12 int p[] = {2,5,3,11,89,76,24,33,15,15}; 13 quickSort(p,0,sizeof(p)/sizeof(int)-1); 14 print(p,sizeof(p)/sizeof(int)); 15 cout << "Hello world!" << endl; 16 return 0; 17 } 18 19 void print(int *p,int length) 20 { 21 for(int i=0;i<length;i++) 22 cout << p[i] << endl; 23 } 24 25 void quickSort(int *p,int begin,int end) 26 { 27 if(begin >= end) 28 return; 29 int pos = partition(p,begin,end); 30 quickSort(p,begin,pos-1); 31 quickSort(p,pos+1,end); 32 } 33 34 int partition(int *p,int left,int right) 35 { 36 int i=left,j=right+1; 37 int povit = left; 38 while(true) 39 { 40 while(p[++i]<p[povit]) 41 { 42 if(i==right)break; 43 } 44 while(p[--j]>p[povit]) 45 { 46 cout << p[j] << endl; 47 } 48 if(i>=j)break; 49 change(p,i,j); 50 } 51 change(p,j,povit); 52 return j; 53 } 54 55 void change(int *p,int pos1,int pos2) 56 { 57 if(pos1 == pos2) 58 { 59 return; 60 } 61 int temp=p[pos1]; 62 p[pos1] = p[pos2]; 63 p[pos2] = temp; 64 }