第八章小结

排序(重新排列表中的元素,使表中的元素满足关键字递增或递减):

稳定性:设表中有两个元素a,b,其对应关键字x,y,且a在b前面,若排序后,a仍在b前面,则我们说该排序算法是稳定的,否则不稳定

内部排序:值在排序期间元素全部放在内存的排序。

插入排序:每次将一个未排列的元素插入到一个已经排好的子序列中进行排序。

直接插入排序:

查找该元素的插入位置,找到后,将该位置后的所有元素都向后移一位,将该元素插入。(适用于顺序存储和链式存储)

时间复杂度:最后O(n),平均O(n平方),最坏O(n平方)

空间复杂度:O(1)

具有稳定性。

折半插入排序:

相当于二分查找后,在找到第一个大或小于该元素的位置后,将该位置后所有元素后移一位。

(适用于顺序存储)

时间复杂度:O(n平方)

空间复杂度:O(1)

具有稳定性

希尔排序:

从前往后两两比较相邻元素,若顺序错了,则交换位置,直到表尾。(适用于顺序存储,链式存储)

时间复杂度:最好O(n),平均O(n平方)最坏O(n平方)

空间复杂度:O(1)

具有稳定性

快速排序

在待排序的表中选取一个元素为基准key,在key位置前所有元素小于key,在key位置后所有元素大于key。设第一个元素为low,最后一个元素为high,不断交换元素中改变两标记,步骤1,high向前移动找到第一个小于key的元素,2,low向后移动找到第一个比key大的元素,3,交换两元素的位置,4一直操作1,2,3步到low>=high(适用于顺序存储)

时间复杂度:最好=平均为O(nlog2n)最坏O(n平方)

空间复杂度:最好=平均为O(nlog2n)最坏O(n)

不具有稳定性

选择排序:

每一趟在排列元素中选取最小的元素,作为有序子序列的第i个元素,直到待排列元素只剩下一个。

时间复杂度:O(n平方)

空间复杂度:O(1)

不具有稳定性

堆排序:小根堆:若L[i]<=L[2i]且L[i]<=L[2i+1],则成为小根堆(1<=i<=[n/2]取下界)大根堆:若L[i]>=L[2i]且L[i]>=L[2i+1],则成为大根堆(1<=i<=[n/2]取下界)

当孩子结点小于双亲结点,则该结点调整结束,当孩子结点大于双亲结点,则将最大的孩子结点于双亲结点交换,继续排,直到孩子结点都小于双亲结点或出现叶子结点。

时间复杂度:O(nlog2 n)

空间复杂度:O(1)

不具有稳定性

归并排序:

将元素分为若干组,反复进行排列合并直到有序。

时间复杂度:0(log2 n)

空间复杂度:O(n)

具有稳定性。

posted @ 2020-07-12 21:33  许剑瀚  阅读(123)  评论(0编辑  收藏  举报