排序

来源:互联网 发布:编程语言是什么样 编辑:程序博客网 时间:2024/06/10 19:24

排序:将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列。

排序的目的:便于查找

排序的基本操作:比较和移动

排序的时间复杂度可用算法执行中的记录关键字比较次数与记录移动次数来衡量。

内部排序:待排序记录存放在内存,排序过程不需要访问外存便能完成

外部排序:排序过程中需对外存进行访问的排序(参加排序的记录数量很大)

关键字相等的记录其先后次序始终不变,则称排序算法为稳定的,具有稳定性;否则不稳定,具有不稳定性

按排序依据原则分类:

插入排序:直接插入排序、折半插入排序、希尔排序

交换排序:冒泡排序、快速排序

选择排序:简单选择排序、堆排序

归并排序:2-路归并排序

基数排序

按时间复杂度分类:

简单的排序方法:O(n²)

先进的排序方法:O(nlog2n)

基数排序:O(d*n)

直接插入排序(算法分析):

关键字比较次数和记录移动次数与记录关键字的初始排列有关。

最好情况下,排序前已按关键字从小到大有序,每趟只需与前面有序记录序列的最后一个记录比较1次,总的比较次数为n-1。

最坏情况下,第i趟时第i个记录必须与前面i个记录都做关键字比较,并且每做1次比较就要做1次数据移动。则总关键字比较次数KCN和记录移动次数RMN分别为:


在平均情况下的关键字比较次数和记录移动次数约为n²/4

直接插入排序的时间复杂度:O(n²)

直接插入排序的空间复杂度:只占用1个缓冲单元,O(1)

直接插入排序是一种稳定的排序方法

使用情况:元素数目少,或者初始序列基本有序

优点:简单,在记录数较少时,是比较好的方法。

折半插入排序:

折半插入排序在查找记录插入位置时,采用折半查找算法,因为折半查找算法比顺序查找快,所以折半插入性能比直接插入排序好。

但需要移动的记录数目与直接插入排序相同,都是O(n²)

折半插入排序的时间复杂度:O(n²)

折半插入排序的空间复杂度:只占用1个缓冲单元,O(1)

折半插入排序是一种稳定的排序方法

冒泡排序:

最好情况下:在记录的初始排序已经按关键字从小到大排好序,只需执行一趟冒泡,做n-1次关键字比较,不移动记录。

最坏情况下:执行n-1冒泡,第i趟做n-i次关键字比较,执行n-i次记录交换,共计:

冒泡排序的时间复杂度:O(n²)

冒泡排序是一种稳定的排序方法

简单选择排序:

关键字比较次数KCN与记录的初始序列无关

设整个待排序记录序列有n个记录,则第i趟选择最小关键字记录所需的比较次数总是n-i次。总的关键字比较次数为:


记录的移动次数与记录序列的初始排列有关,当这组记录的初始状态按其关键字从小到大有序的时候,记录的移动次数RMN=0

最坏情况是每一趟都要进行交换,总的记录移动次数为RMN=3(n-1)

直接选择排序的时间复杂度:O(n²)

直接选择排序是一种不稳定的排序方法

快速排序:

初始关键字:21 25 49 25* 16 08

快速排序是一个递归过程,其递归树如图:


利用序列第一个记录作为基准,将整个序列划分为左右两个子序列。

快速排序的趟数取决于递归树的高度

如果每次划分对一个记录定位后,该记录的左侧子序列与右侧子序列的长度相同,则下一步将是对两个长度减半的子序列进行排序,这是最理想的情况。

在n个元素的序列中,对一个记录定位所需时间为O(n),假设t(n)是对n个元素的序列进行排序所需的时间,而且每次对一个记录正确定位后,正好把序列分为长度相等的两个子

序列,此时总的计算时间为:



快速排序的平均计算时间:O(nlog2n)

实验结果表明:就平均计算时间而言,快速排序是所有排序方法中最好的一个

但快速排序是一种不稳定的排序方法

在最坏情况下,即待排序记录序列已经按其关键字从小到大排好序,其递归树成为单支树。

必须经过n-1趟才能把所有记录定位

第i趟需要经过n-i次关键字比较才能找到第i个记录的安放位置,总的关键字比较次数达到:


希尔排序(缩小增量排序):

从直接插入排序可以看出,当待排序列为正常时,时间复杂度为O(n)

若待排序列基本有序时,插入效率会提高

基本思想:对待排记录序列先作”宏观“调整,再做”微观“调整。宏观调整指的是”跳跃式“的插入排序

希尔排序方法是先将待排序列分成若干个子序列分别进行插入排序,待整个序列基本有序时,再对全体记录进行一次直接插入排序

开始时gap的值较大,子序列中的记录较少,排序速度较快,而且记录一次移动的间隔较大,随着排序进展,gap值逐渐变小,子序列中记录个数逐渐变多,由于前面大多数记

录已基本有序,所以排序速度仍然比较快。

gap的取法:gap=floor(n/2),gap=floor(gap/2),直到gap=1

希尔排序的时间复杂度约为:O[n*(log2n)²]

希尔排序的空间复杂度:O(1),只占用1个缓冲单元,用于暂存当前待插入的记录

希尔排序是一种不稳定的排序方法

希尔排序适用于待排序的记录数目较大时

各种排序方法比较:




0 0
原创粉丝点击