回忆Partition算法及利用Partition进行快排

 一.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算法是很常用的一种算法,并且不止一种方法,目前就只记这种比较好理解的了。

原文地址:https://www.cnblogs.com/xiangqi/p/10485379.html