/*
* 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] << " " ;
}
}