快速排序的思想
- 划分区间,中间有个flag,左边的数小于a[flag],右边的数大于a[flag]。 注意,虽然左<中 && 中 < 右,但是在左右各自区间可能不是有序的,只是整体小或大而已。
- 处理左区间,递归处理就行。
- 处理右区间,递归处理就行。
整体框架,划分区间函数
/**********************************
* @param a : 待排序数组
* @param p : 数组起始位置 (我的是从0开始)
* @param r : 数组末尾位置
***********************************/
void quickSort(int a[],int p,int r){
if(p < r){ // 每一次如果该区间左坐标小于右坐标
int q = partition(a,p,r); //得到flag,中间坐标,划分区间
quickSort(a,p,q-1); //处理左区间
quickSort(a,q+1,r); //处理右区间
}
}
得到中间flag下标具体函数:
/**********************************
* @param a : 待排序数组
* @param p : 数组起始位置 (我的是从0开始)
* @param r : 数组末尾位置
***********************************/
int partition(int a[],int p,int r){
int i = p; //左指针
int j = r+1; //右指针
int x = a[p]; //根据x大小划分区间,左小右大,这里为数组中的a[0]
while(1){
while(i < r && a[++i] < x); //合法下标内,找到比x大的数
while(a[--j] > x); //合法下标内,找到比小的数
if(i >= j) break; //左指针位置比右指针还超前,退出
swap(a[i],a[j]); //左边大的数和右边小的数交换
} //死循环结束后得到的是第0号位置是中间数,它不应该在第0号位置
swap(a[p],a[j]); //把中间数交换到j位置,为什么呢?你看看我们的死循环退出条件,位置j上的数一定会小于x,交换过来不就x左小,x右大了嘛
return j; //返回这个中间下标flag
}
main函数:
#include <bits/stdc++.h>
#define N 9
using namespace std;
int a[] = {9,8,7,6,5,4,3,2,1};
int main(){
quickSort(a,0,N-1);
for(int i = 0;i < N;i++){
cout << a[i] << "\t";
}
return 0;
}
运行结果: