排序算法
稳定性:不稳定排序算法可能会在相等的键值中改变纪录的相对次序,但是稳定排序算法从来不会如此
冒泡排序(Bubble Sort,
):
- 依次比较相邻的两个数,如果不符合排序规则,则调换两个数的位置。这样一遍比较下来,能够保证最大(或最小)的数排在最后一位。
- 再对最后一位以外的数组,重复前面的过程,直至全部排序完成。
选择排序与冒泡排序类似,也是依次对相邻的数进行两两比较。不同之处在于,它不是每比较一次就调换位置,而是一轮比较完毕,找到最大值(或最小值)之后,将其放在正确的位置,其他数的位置不变。
插入排序(Insertion Sort,
):将数组分成"已排序"和"未排序"两部分,一开始的时候,"已排序"的部分只有一个元素,然后将它后面一个元素从"未排序"部分插入"已排序"部分
- 从第一个元素开始,该元素可以认为已经被排序
- 取出下一个元素,在已经排序的元素序列中从后向前扫描
- 如果该元素(已排序)大于新元素,将该元素移到下一位置
- 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
- 将新元素插入到该位置后
- 重复步骤2~5
合并排序(归并排序,Merge sort,
):它的基本思想是,将两个已经排序的数组合并,要比从头开始排序所有元素来得快。因此,可以将数组拆开,分成n个只有一个元素的数组,然后不断地两两合并,直到全部排序完成。
- 在两个序列中,比较当前元素(当前=头一次出现的第一个)
- 然后取出最小的元素放进元素序列中
- 找到(两个)序列的下一个元素,(比较后)取出最小的
- 重复1、2、3步骤,直到其中一个序列中的最后一个元素
- 然后取出另一个序列剩余的元素放入元素序列中。
// 可以使用 『原地算法』(in-place algorithm) 优化内存占用
// 可以使用『外部排序』(external sorting) 优化 I/O(使用少量内存时)
// 可以优化成在多处理器/多线程/多服务器上运行
堆排序(Heap sort,
- 最大堆调整(Max-Heapify):将堆的末端子节点作调整,使得子节点永远小于父节点
- 创建最大堆(Build-Max-Heap):将堆所有数据重新排序,使其成为最大堆(顶堆是最大值)
- 堆排序(Heap-Sort):移除位在第一个数据的根节点,并做最大堆调整的递归运算
Smoothsort(O(n log n))
快速排序:其它笔记
Timsort:其它笔记
(^-^) 睡眠排序: 并发线程睡眠