排序算法基本功: Partition函数

150 阅读1分钟

简介

在快速排序中, 需要依赖一个名为Partition的排序算法.

其核心思想是:

  1. 确定一个基准(key/index/pivot)
  2. 比基准小的数往左边扔, 比基准大的数往右边扔
  3. 将基准插入分界位置

实现

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};

疑难解答:

  1. 在循环中赋值, 似乎arr[lo]被覆盖掉了, 那么arr[lo]的值跑哪去了???: 实际上, arr[lo]的值被key记录下来了, 也就是说, arr[lo]只是腾了个位置出来, 方便后面交换元素.

  2. 可以用其他基准吗???: 当然, 不过要改算法, 和这个代码不一样.