算法一:高速排序算法
高速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比較。在最坏状况下则须要Ο(n2) 次比較,但这样的状况并不常见。其实,高速排序通常明显比其它Ο(n log n) 算法更快,由于它的内部循环(inner loop)能够在大部分的架构上很有效率地被实现出来。
高速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。
算法步骤:
1 .首先从所有数列中挑选一个元素,把它当做“基准”。
2 .再按照1步排序之前基准的左边,元素小于基准放一边,元素小于基准放另一边(相同的数能够到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
3 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,可是这个算法总会退出。由于在每次的迭代(iteration)中。它至少会把一个元素摆到它最后的位置去。
算法二:堆排序算法
堆排序(Heapsort)是指利用堆这样的数据结构所设计的一种排序算法。
堆积是一个近似全然二叉树的结构,并同一时候满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
堆排序的平均时间复杂度为Ο(nlogn) 。
算法步骤:
1. 创建一个堆H[0..n-1]
2. 把堆首(最大值)和堆尾互换,互换之后堆尾就是最大值
3. 再把堆的尺寸缩小1(最大值已确认),并调用 shift_down (0),目的是把新的数组顶端数据调整到相应位置