Skip to the content.

排序算法

稳定性

能保证排序前两个相等的数在排序后顺序不变, 则是稳定的

好处

排序算法如果是稳定的, 那么从一个键上排序, 然后再从另一个键上排序, 第一个键的结果可以为第二个键排序所用.

稳定性分析

外排序有哪些

常见外排序用途

流程

假设: 1G数据, 100m内存

  1. 读入 100m 至数据内, 使用外排序在内存中完成排序
  2. 将排序完成的数据写入磁盘
  3. 重复步骤1, 2直到所有数据都存入了不同的 100m 的块 (临时文件中)
  4. 读入每个临时文件(顺串)的前 10m 的数据放到内存中的输入缓冲取, 最后的 10m 作为输出缓冲区.
  5. [多路合并, 提高效率]执行10路归并算法, 将结果输出到缓冲区中, 一旦缓冲区满, 将缓冲区中的数据写到目标文件, 清空缓冲区, 一旦10个输入缓冲区中的一个变空, 就从这个缓冲区关联的文件中读入下一个10m数据,除非这个文件已经读完.

优化

排序算法

快排

思路: 在数组中选择一个数作为比较数p, 然后双指针指向数组左右 l, r, r从右向左遍历, 找到第一个比 p 小的数, l 从左向右遍历, 找到第一个比 p 大的数, 找到后交换 l, r 的值. 当 l >= r 时, 交换 p 和 l, 一趟排序完成. 然后递归排序 [start, l-1), (l+1, end]. 递归完成则排序完成.

代码:

func quickSort(arr []int, start, end int) {
    if start >= end {
        return
    }
    // 取比较点
    p := arr[start]
    l, r := start, end
    for l < r {
        // 先从右侧找小于p的数, 
        for l < r && arr[r] >= p {
            r--
        }
        for l < r && arr[l] <= p {
            l++
        }
        if l < r {
            arr[l], arr[r] = arr[r], arr[l]
        }
    }
    arr[l], arr[start] = arr[start], arr[l]
    quickSort(arr, start, l-1)
    quickSort(arr, l+1, end)
}