1 你会学到什么?
彻底弄明白常用的排序算法的基本思想,算法的时间和空间复杂度,以及如何选择这些排序算法,确定要解决的问题的最佳排序算法,上个推送总结了冒泡排序和其改进后的快速排序这两个算法,下面总结直接选择排序到堆排序的改进,后面再继续总结插入排序、希尔排序、归并排序和基数排序。
2 讨论的问题是什么?
各种排序算法的基本思想;讨论各种排序算法的时间、空间复杂度;以及算法的稳定性;算法是如何改进的,比如冒泡排序如何改进成了目前最常用的快速排序的,直接选择排序到堆排序的改进,正是接下来要讨论的对象。
3 相关的概念和理论
内部排序
若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序。
外部排序
若参加排序的记录数量很大,整个序列的排序过程不可能在内存中完成,则称此类排序问题为外部排序。
就地排序
若排序算法所需的辅助空间并不依赖于问题的规模n,即辅助空间为O(1),称为就地排序。
稳定排序
假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序后,这些记录的相对次序保持不变,即在原序列中 ri=rj, ri 在 rj 之前,而在排序后的序列中,ri 仍在 rj 之前,则称这种排序算法是稳定的;否则称为不稳定的。
排序序列分布
排序需要考虑待排序关键字的分布情况,这会影响对排序算法的选择,通常我们在分析下列算法时都考虑关键字分布是随机分布的,不是按照某种规律分布的,比如正态分布等。
待排序序列
排序序列中,剩余即将要排序的序列部分。
已排序序列
排序序列中,已经排序好的序列部分。
4 直接选择排序
直接选择排序,英文名称 :Straight Select Sorting,是一个直接从未排序序列选择最值到已排序序列的过程。
基本思想
第一次从R[0]~R[n-1]中选取最小值,与R[0]交换;
第二次从R[1]~R[n-1]中选取最小值,与R[1]交换,….,
第 i 次从R[i-1]~R[n-1]中选取最小值,与R[i-1]交换,…..,
总共通过n-1次,得到一个按关键码从小到大排列的有序序列。
升序排序的例子
我们仍然用上节冒泡排序和快速排序举的例子。待排序列
3 2 5 9 2
演示如何用直接选择排序得到升序序列。
第一轮,从所有关键码中选择最小值与 R[0]交换,3与2交换,如下图所示,