简介
在快速排序中, 需要依赖一个名为Partition的排序算法.
其核心思想是:
- 确定一个基准(key/index/pivot)
- 比基准小的数往左边扔, 比基准大的数往右边扔
- 将基准插入分界位置
实现
C:
int* Partition(int arr[], int lo, int hi) {
int key = arr[lo];
while(lo < hi) {
while(lo < hi && arr[hi] > key) { // 从后往前找第一个arr[hi]<key的值(简化思考, 就不考虑=了, 大脑内存不够)
--hi;
}
arr[lo] = arr[hi];
while(lo < hi && arr[lo] < key) { // 从前往后找第一个arr[lo]>key的值
++lo;
}
arr[hi] = arr[lo];
}
arr[hi] = key; // 外层大while循环结束后, hi=lo, 也就是指向同一个位置, 即分界位置, 将基准插入
return arr;
}
测试用例:
int arr[4] = {2, 4, 3, 1};
疑难解答:
-
在循环中赋值, 似乎arr[lo]被覆盖掉了, 那么arr[lo]的值跑哪去了???: 实际上, arr[lo]的值被key记录下来了, 也就是说, arr[lo]只是腾了个位置出来, 方便后面交换元素.
-
可以用其他基准吗???: 当然, 不过要改算法, 和这个代码不一样.