排序算法


稳定性:不稳定排序算法可能会在相等的键值中改变纪录的相对次序,但是稳定排序算法从来不会如此

冒泡排序(Bubble Sort,
):
  1. 依次比较相邻的两个数,如果不符合排序规则,则调换两个数的位置。这样一遍比较下来,能够保证最大(或最小)的数排在最后一位
  2. 再对最后一位以外的数组,重复前面的过程,直至全部排序完成。

选择排序与冒泡排序类似,也是依次对相邻的数进行两两比较。不同之处在于,它不是每比较一次就调换位置,而是一轮比较完毕,找到最大值(或最小值)之后,将其放在正确的位置,其他数的位置不变

插入排序(Insertion Sort,
):将数组分成"已排序"和"未排序"两部分,一开始的时候,"已排序"的部分只有一个元素,然后将它后面一个元素从"未排序"部分插入"已排序"部分
  1. 从第一个元素开始,该元素可以认为已经被排序
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描
  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置
  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
  5. 将新元素插入到该位置后
  6. 重复步骤2~5

合并排序(归并排序,Merge sort,
):它的基本思想是,将两个已经排序的数组合并,要比从头开始排序所有元素来得快。因此,可以将数组拆开,分成n个只有一个元素的数组,然后不断地两两合并,直到全部排序完成。
  1. 在两个序列中,比较当前元素(当前=头一次出现的第一个)
  2. 然后取出最小的元素放进元素序列中
  3. 找到(两个)序列的下一个元素,(比较后)取出最小的
  4. 重复1、2、3步骤,直到其中一个序列中的最后一个元素
  5. 然后取出另一个序列剩余的元素放入元素序列中。
// 可以使用 『原地算法』(in-place algorithm) 优化内存占用
// 可以使用『外部排序』(external sorting) 优化 I/O(使用少量内存时)
// 可以优化成在多处理器/多线程/多服务器上运行

堆排序Heap sort,
是指利用这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构(用数组的方式表示),并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
  • 最大堆调整(Max-Heapify):将堆的末端子节点作调整,使得子节点永远小于父节点
  • 创建最大堆(Build-Max-Heap):将堆所有数据重新排序,使其成为最大堆(顶堆是最大值)
  • 堆排序(Heap-Sort):移除位在第一个数据的根节点,并做最大堆调整的递归运算

SmoothsortO(n log n))

快速排序:其它笔记
Timsort:其它笔记

(^-^) 睡眠排序: 并发线程睡眠