排序思路:
1.选定中心轴(基准值),一般取arr[0];
2.将右侧小于中心轴的数字放到中心轴的左边,将左侧大于中心轴的数字放到中心轴的右边(实现上可以用左右索引)直到左右索引相遇,将中心轴位置的值放到相遇的索引位置即实现了以中心轴为划分左右;
3.分别对左右子序列重复前三步操作,直到子序列长度为1,递归跳出,排序完成。
代码的实现:
void quickSort(int arr[],int l,int r){
/*如果l>=r,不用排序*/
if(l>=r){
return;
}
/*保存每次排序的基准值*/
int centreVal = arr[l];
/*记录待排序数组左右索引*/
int rightIndex = r;
int leftIndex = l;
/*左索引<右索引开始排序*/
while(leftIndex<rightIndex){
/*右索引所指的值先比较,大于基准值则递减向左继续遍历*/
while(leftIndex<rightIndex && arr[rightIndex]>=centreVal){
rightIndex--;
}
/*找到小于基准值的元素,判断左右索引不等则将右索引所指元素赋值给左索引所指位置*/
if(leftIndex<rightIndex){
arr[leftIndex] = arr[rightIndex];
}
/*再比较左索引所指的值,小于基准值则递增向右继续遍历*/
while(leftIndex<rightIndex && arr[leftIndex]<=centreVal){
leftIndex++;
}
/*找到大于基准值的元素,判断左右索引不等则将左索引所指元素赋值给右索引所指位置*/
if(leftIndex<rightIndex){
arr[rightIndex] = arr[leftIndex];
}
/*左右索引相遇时本次排序完成,将保存的基准值放到两索引相遇的位置*/
if(leftIndex>=rightIndex){
arr[leftIndex]=centreVal;
}
}
/*递归对基准值左右两边的数组分别排序*/
quickSort(arr,l,rightIndex-1);
quickSort(arr,leftIndex+1,r);
}