稳定排序算法是指在排序过程中两个排序关键字相同的元素,在排序的过程中位置不发生变化。
1.直接插入排序:
每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。
第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从后向前扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程,是稳定排序。
2.直接选择排序:
首先在所有记录中选出排序吗最小的记录,把它跟第一个记录交换,然后在其余的记录内选出排序码最小的记录,跟第二个记录交换...以此类推,直到所有记录排完为止。是不稳定排序。
平均时间复杂度:o(n^2);原因:无论文件初始如何,第 i 趟排序都要选出最小关键字的记录,须作 n - i 比较,因此总比较数为 n*(n-1)/2= o(n^2)。
3.堆排序:
是对直接选择排序的有效改进。分为大根堆和小根堆。大根堆的根节点是堆里所有节点关键字中最大的。不稳定排序。
设有待排序序列 {12,56,23,26,15,86,92,75,65}:
(大根堆) 根据原序列形成二叉树,从最底子树开始,判断子节点是否大于父节点,如果是就跟父节点交换,使子节点都小于父节点,过 程如图8.8;
形成初始堆:图8.9第一个图
将根节点输出,将最底子节点置顶并再次执行图8.8的建堆过程.....以此类推,最终输出答案。
最坏时间复杂度:o(nlog2n);原因:图8.8初始堆过程,当每个阶段堆的最大节点都在最底层时,就需要至少d次交换,d为树的高度,根据二叉树节点n与高度d的关系为:d^2-1=n;求出 d = log2(n+1)=log2(n);所以每次初始堆过程需要的时间复杂度为o(n) = log2(n);又因为一共有n个节点,所以要初始化和输入n次,所以时间复杂度为:o(nlog2n) 。