三、选择排序
1.简单选择排序
思想:总是从其余部分选择出最大或最小的记录到有序子列中, 开始时有序子列的长度为0,随着每趟的选择长度每次增加1。
从程序中可看出,简单选择排序移动记录的次数较少,但关键码的比较次数依然是
1 ─ 2 |
n(n+1),所以时间复杂度仍为O(n2)。 |
2.锦标赛选择排序
3.堆排序
思想:是对锦标赛选择排序的改进。
堆的概念:称n个元素的序列 k1,k2,…,k为堆,当且仅当,若以一维数组存储一个堆,则堆对应一棵完全二叉树,且所有非叶结点的值均不大于(或不小于)其子女的值,根结点的值是最小(或最大)的。
实现堆排序需解决两个问题:
1. 如何将n个元素的序列按关键码建成堆;
2. 输出堆顶元素后,怎样调整剩余n-1个元素,使其按关键码成为一个新堆。
堆排序:对n个元素的序列进行堆排序,先将其建成堆,以根结点与第n个结点交换;调整前n-1个结点成为堆,再以根结点与第n-1个结点交换;重复上述操作,直到整个序列有序。
【效率分析】
次,交换记录至多k次。所以,在建好堆后,排序过程中的筛选次数不超过下式:
2( ëlog2(n-1)û + ëlog2(n-2)û + … + log22û ) < 2( ëlog2(n-1)û + ëlog2(n-2)