1. 程式人生 > >回憶Partition算法及利用Partition進行快排

回憶Partition算法及利用Partition進行快排

sta -m 就是 color 基本 結果 num 一次 name

一.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算法是很常用的一種算法,並且不止一種方法,目前就只記這種比較好理解的了。

回憶Partition算法及利用Partition進行快排