快排的精髓在于partition,这里写了容易理解的写法:
就是令最开始的index的val为哨兵元素povit,然后从两边排,左边的如果出现x>povit,则停止;右边出现y<povit则停止;此时可交换x,y;当然还有判断条件;
代码很清晰:
#include <cstdio>
#include <algorithm>
#include <cstdlib>
void qsort(int* arr,int p,int r){
if(NULL == arr || p >= r){
return;
}
int x = arr[p];
int i = p+1;
int j = r-1;
while(true){
while(arr[i] < x){
++i;
}
while(arr[j] > x){
--j;
}
if(i<j){
std::swap(arr[i], arr[j]);
}
else{
break;
}
}
std::swap(arr[p], arr[j]);
qsort(arr, p, j);
qsort(arr, j+1, r);
}
int main(){
int arr[] = {1,-28, 89,-90,900};
int size = sizeof(arr)/sizeof(arr[0]);
qsort(arr, 0, size);
for(int i = 0; i < size; ++i){
printf("%d ", arr[i]);
}
printf("\n");
}