1. 快排在每次排序之前都需要选定好一个元素(枢轴元素),然后把比它小的元素放在左边,把比它大的元素放在右边,从另一个角度来看,快排其实每次都是帮助一个元素找定它在数组中的位置。
2. 如果一个数组已经排好序,找到了枢轴元素的位置:
把枢轴元素前面的数组位置当做一个个坑,那么我们要做的事情就是把小于枢轴元素的值放入坑中,大的元素每次都直接跳过,代码实现起来就是:(由于一开始枢轴元素选定是可以随便选的,所以选取数组中最后一个元素当做枢轴元素)
// length 为 array 数组的元素个数
int pivot = array[length-1]; // 最后一个元素当做枢轴元素
int partition = 0; // 坑的位置
for (int i = 0; i < length-1; ++i) { // 只扫描一遍数组
if(array[i] < pivot){ // 如果比枢轴元素小
Swap(array,i,partition); // 交换数组中 i 元素和 partition 元素的位置
partition++; // 一个坑占满,找下一个坑
}
}
把坑占满后,由于每次填坑之后,坑的位置会++,所以此时枢轴元素的位置实际上是比枢轴元素值大的第一个元素,再交换它与选定的枢轴元素
Swap(array,partition,right); // 交换最后一个元素和第一个比枢轴元素大的坑
这样,一次快排就完成了,剩下的需要利用递归,完整代码如下:
#include <stdio.h>
// 数组元素交换
void Swap(int array[], int first, int second){
int temp = array[first];
array[first] = array[second];
array[second] = temp;
}
int Partition(int array[], int left, int right){
int pivot = array[right]; // 最后一个元素当做枢轴元素
int j = left;
for (int i = left; i < right; ++i) {
if(array[i] < pivot){ // 如果比枢轴元素小
Swap(array,i,j);
j++;
}
}
Swap(array,j,right); // 交换最后一个元素和第一个比枢轴元素大的坑
return j;
}
void QuickSort(int array[], int left, int right){
if(left >= right) // 递归的结束条件不能忘啊!!!
return;
int partition = Partition(array, left, right);
QuickSort(array, left, partition-1);
QuickSort(array, partition+1, right);
}
int main(){
int array[] = {6,6,7,0,2,1,4,5,6,7};
QuickSort(array, 0,9);
for (int i = 0; i < 10; ++i) {
printf("%d ", array[i]);
}
return 0;
}