数据结构 - 第八章 排序

概述

排序:将含有n个记录的序列按照关键字k递增或递减的顺序排列的操作。

数据结构 - 第八章 排序_第1张图片

在排序的诸多标准中,稳定性非常重要。如果ki=kj,并且i领先于j。在排序之后,i仍然领先于j,则该方法稳定,否则不稳定。

内排序:在排序整个过程中,待排序的所有记录全部被放置在内存中。

外排序:由于排序的记录个数太多,不能同时放置在内存,整个排序过程需要在内外存之间多次交换数据才能进行。

从算法的简单性来看,我们将7种算法分为两类:
简单算法:冒泡、简单选择、直接插入。
改进算法:希尔、堆、归并、快速。

 

直接插入排序:依次将未排序的记录插入左边有序的记录序列。一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。

平均O(n2) 最好O(n) 最坏O(n2)

折半插入排序

平均O(n2) 最好O(n) 最坏O(n2)

希尔排序:将相距某个“增量”的记录组成一个子序列,这样才能保证在子序列内分别进行直接插入排序后得到的结果是基本有序而不是局部有序。将待排序的记录分成s1个组,所有距离s1的记录分在同一组内进行排序;取s2

增量选取决定了时间复杂度,但必然小于O(n2)。

直接选择排序:通过 n-i 次关键字间的比较,从 n-i+1 个记录中选出关键字最小的记录,并和第 i (1

平均O(n2) 最好O(n) 最坏O(n2)

堆排序:堆是具有下列性质的完全二叉树,每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。

将待排序的序列构造成一个大顶堆。此时,整个序列的最大值就是堆顶的根结点。将它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值),然后将剩余的 n-1 个序列重新构造成一个堆, 这样就会得到n个元素中的次小值。如此反复执行,便能得到一个有序序列了。

平均O(nlog2n) 最好O(nlog2n) 最坏O(nlog2n)

起泡排序:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。改进方法:设置一个flag标志位,若某次冒泡没有改变,说明已经按顺序排列,则停止比较。

平均O(n2) 最好O(n) 最坏O(n2)

快速排序:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。

枢轴:关键字所在位置,左边的值都比它小,右边的值比它大。

平均O(nlog2n) 最好O(nlog2n) 最坏O(n2)

优化措施有两种,一种是合理选择枢轴,另一种是当分区较小时可直接插入排序。

归并排序:利用归并的思想实现的排序方法。它的原理是假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到[n/2] ([x]表示不小于x的最小整数) 个长度为2或1的有序子序列;再两两归并,....如此重复,直至得到一个长度为n的有序序列为止,这种排序方法称为2路归并排序。

平均O(nlog2n) 最好O(nlog2n) 最坏O(nlog2n)

数据结构 - 第八章 排序_第2张图片

 

参考教材:

《数据结构与算法》,熊岳山著,清华大学出版社,2016,第二版

《2020年数据结构考研复习指导》,电子工业出版社,2020

你可能感兴趣的:(数据结构)