一.Partiton算法
Partiton算法的主要内容就是随机选出一个数,将这个数作为中间数,将大于它的排在它右边,小于的排在左边(无序的)。
1 int partition (int arr[],int start,int end) //传入一个数组和要进行partition的范围 2 { 3 4 int pivot = arr[start]; // 将第一个数做为中间数 5 6 while( start < end ){ 7 8 while (start<end&&arr[end]>=pivot) //从右边开始寻找,找到第一个小于中间数的数 9 end--; 10 arr[start]=arr[end];//找到后往最左边的位置放 11 while (start<end&&arr[start]<=pivot) //同理,从最左边开始寻找,找到第一个大于中间数的数,往右边放 12 start++; 13 arr[end]=arr[start];//因为end的位置是之前第n个比中间数小的数,并且已经放在了靠左的位置,所以此时可以将比中间数大的数往end填 14 } 15 arr[start]=pivot; 16 return start; //返回中间值的下标 17 }
二.利用Partition进行快排
基本原理就是把某个范围一直缩小并且一直Partition.
为了直观直接拿出一个数组进行排序。(可直接运行观察结果)
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 int num[9]={1,4,2,6,3,5,3,3,8}; 6 7 int partition (int arr[],int start,int end) //[start,end] 8 { 9 10 int pivot = arr[start]; 11 12 while( start < end ){ 13 14 while (start<end&&arr[end]>=pivot) 15 end--; 16 arr[start]=arr[end]; 17 while (start<end&&arr[start]<=pivot) 18 start++; 19 arr[end]=arr[start]; 20 } 21 arr[start]=pivot; 22 return start; 23 } 24 25 void sort(int arr[],int l,int r){ //将[l,r]范围内进行排序 26 int mid = partition(num,l,r); //在该范围进行一次partition,得到中间值的下标mid,可知此时mid对应的数以左的数比它小,以右的数比它大 27 if(mid>l)sort(arr,l,mid-1); //[l---mid--------------------r] 当mid大于范围的最小下标时,将[l,mid-1]范围内进行一次partition 28 if(mid<r)sort(arr,mid+1,r); //同理,当mid小于范围的最大下标时,将[mid+1,r]范围内进行一次partition 29 } //分到最后每个数的左边的数都比它本身小,右边的数都比它本身的大,也就完成了从小到大的排序。 30 31 int main ( int argc, const char * argv[]) 32 { 33 sort(num,0,8); 34 for(int i=0;i<9;i++) 35 cout<<num[i]<<" "; 36 return 0; 37 }
为了防止忘记写下这篇博客,毕竟partition算法是很常用的一种算法,并且不止一种方法,目前就只记这种比较好理解的了。