/*
* 316-quicksort.cpp
*
* Created on: 2020年5月28日
* Author: panzhengji
*/
#include<string>
#include<iostream>
using std::cout;
using std::endl;
void swap(int p_int[], int first , int end){
int tmp = p_int[end];
p_int[end] = p_int[first];
p_int[first] = tmp;
}
// 從小到大排序
void sort(int p_int[], int start, int end){
if(!(start<end)){
return; // 遞歸函數的出口,只有一個元素了,那說明已經遞歸到了終點,返回結果值
}
// 取當前中間的值作爲基準值,放到第一位
swap(p_int,start,(start+end)/2);
// current 爲該元素最終的位置,其右側元素都大於等於他,其左側元素都小於等於他
// current 的值設置爲 start,先假設右側的所有元素都大於等於標準值
int current = start;
// for 循環逐一驗證,右側的值,是否符合假設: 都大於等於標準值
for(int i = start +1; i <= end ; i++){ // start 是標準值, start+1 是第一個檢驗的元素
// p[i] 是檢驗的元素 , p[start] 是標準值 , 一旦發現不符合的元素,需要變更 current 的位置,以保證其右側大於它,其左側小於它
if(p_int[i] < p_int[start]){
//swap(p_int,++current,i); // 這裏註釋掉,不使用這麼難懂的寫法
// 這裏加一的原因是: 由於發現一個不符合條件的值,所以先加一,加一後,其左側第一個元素一定是大於等於它的
// 分兩種情況,第一: 如果本身就是初始值 start,那麼符合等於的情況, 如果一旦發生交換後,那麼 current+1 對應的值,也是大於等於的
current = current + 1;
// 進行交換: 將+1後得到的大於標準值的元素 和 i 小於標準值的元素交換位置,得到的結果就是:current右側的值大於標準值,左側的小於標準值
swap(p_int,current,i);
}
}
swap(p_int,start,current);
sort(p_int,start,current-1);
sort(p_int,current+1,end);
}
int main(){
int p_int[] = {9,3,4,2,3,5,11,45,22};
cout << "before sort : " << endl;
for(unsigned int i = 0 ; i < sizeof(p_int)/sizeof(p_int[0]) ; i++){
cout << p_int[i] << " " ;
}
sort(p_int,0,sizeof(p_int)/sizeof(p_int[0])-1);
// swap(p_int,0,2);
cout << endl;
cout << "after sort : " << endl;
for(unsigned int i = 0 ; i < sizeof(p_int)/sizeof(p_int[0]) ; i++){
cout << p_int[i] << " " ;
}
}