数据结构基础攻略——排序(Sort)

1.基本概念

1)排序是指使得含有n个记录的序列成为按记录有序的序列的操作。

2)稳定排序是指将含有两个以上(含两个)相同记录的序列排序,排序操作前后,这些相同记录的相对前后次序保持不变;稳定排序包括:冒泡排序、简单选择排序、直接插入排序、归并排序;不稳定排序包括:希尔排序、堆排序、快速排序。

3)内排序是指只在内存完成排序操作;外排序是指在内外存完成排序操作。

2.冒泡排序(BubbleSort)

1)基本思想:类似于气泡往上升的过程,关键字小的往上升,关键字的的往下沉。每一趟排序须将待排序记录中的相邻记录进行两两比较,若反序则交换相邻元素的位置,最终使得待排序记录中最小的关键字放到待排序序列的第一个位置。

2)具体操作:假设待排序序列为data[0],…,data[n-1],第一趟排序,待排序序列为data[r0], …, data[rn-1],从后往前循环data序列比较相邻元素,即先比较data[rn-1]与data[rn-2],若反序则交换两个元素的位置,直到待排序序列最后的两个元素data[r0]与data[r1]完成比较,故待排序序列的第一个元素data[r0]即为待排序中关键字最小的元素;第二趟排序,待排序序列为data[r1], …, data[rn-1],从后往前循环data序列比较相邻元素,即先比较data[rn-1]与data[rn-2],若反序则交换两个元素的位置,直到待排序序列最后的两个元素data[r1]与data[r2]完成比较,故待排序序列的第一个元素data[r1]即为待排序中关键字最小的元素;第三趟排序,……,依此类推,直到完成第n-1趟排序操作为止。

3)最坏情况共需完成n(n-1)/2次比较和交换操作,故其时间复杂度为O(n2)。

3.简单选择排序(Simple Selection Sort)

1)基本思想:每一趟排序都从待排序序列中选出关键字最小的元素,并将其放到待排序序列的第一个位置。

2)具体操作:假设待排序序列为data[0],…,data[n-1],第一趟排序,待排序序列为data[r0], …, data[rn-1],两两比较序列中的所有记录,每次两两比较均将较小记录的序号存放在min变量中,完成所有比较后,将待排序序列的第一个元素data[r0]与data[rmim]交换,故待排序序列的第一个元素data[r1]即为待排序中关键字最小的元素;第二趟排序,待排序序列为data[r1], …, data[rn-1],重复第一趟的操作,……,依此类推,直到完成第n-1趟排序操作为止。

3)最好最坏情况共需完成n(n-1)/2次比较操作,故其时间复杂度为O(n2)。

4.直接插入排序(Straight Insertion Sort)

1)基本思想:每一趟排序都将待排序序列的第一个元素插入到已经有序的序列中,并且找出这个元素在序列中的正确插入位置,从而得到一个记录数增1的有序新序列。

2)具体操作:假设待排序序列为{data[0],…,data[n-1]},第一趟排序,待排序序列为{data[r1], …, data[rn-1]},有序序列为data[r0],将用temp记录待排序序列的第一个元素data[r1],比较data[r0]与data[r1],若反序则将data[r0]后移到data[r1],将temp插入到有序序列的正确插入位置data[r0],完成操作后可得到一个记录数为2的有序序列{data[r0],data[r1]};第二趟排序,待排序序列为{data[r2], …, data[rn-1]},有序序列为{data[r0] ,data[r1]},将用temp记录待排序序列的第一个元素data[r2],将data[r2]与从后往前有序序列各个元素比较,若反序则将该有序序列的元素后移,否则将temp插入到该元素的后一个位置,完成操作后可得到一个记录数为3的有序序列{data[r0],data[r1],data[r2]};第三趟排序,……,依此类推,直到完成第n-1趟排序操作为止。

3)最好最坏情况共需完成n(n-1)/2次比较和移动操作,故其时间复杂度为O(n2)。

5.希尔排序(ShellSort)

1)基本思想:它是一种缩小增量排序,在相距增量为increment的子序列对其进行直接插入排序操作,随后根据增量的递减规则缩小increment,而形成增量为increment的新子序列,再对各个新子序列进行直接插入排序操作,依此类推,直到完成对increment为1的子序列(整个序列)的直接插入排序操作为止。

2)时间复杂度为O(n(log n)2)。

6.堆排序(HeapSort)

1)大顶堆是指树中任一非叶子的值都不小于其左右孩子结点的值;小顶堆是指树中任一非叶子的值都不大于其左右孩子结点的值。

2)构造大顶堆的基本思想:从下往上,从右到左,将每个非叶结点当作根结点,把它及其子树调整成大顶堆。将堆中某一非叶子结点i及其子树调整成大顶堆的算法:先将结点i当作根结点,将结点i及其左右孩子2i、2i+1中的最大结点与结点i交换,再以被i交换的结点为根结点,重复以上过程,直到到达叶子结点为止。

3)堆排序的基本思想:第一趟排序,先将待排序序列造成一个大顶堆,将堆顶元素(最大值)移走作为有序序列的最后一个元素,并把堆底最后一个元素移到堆顶而形成含有n-1个结点的新堆;第二趟排序,对新堆重新构造成一个新的大顶堆,将堆顶的元素移走作为有序序列的倒数第二个元素,并把堆底最后一个元素移到堆顶而形成含有n-2个结点的新堆,对新堆重新构造成一个新的大顶堆……依此类推,直到完成第n-1趟排序操作为止(即堆剩下一个结点)。

4)最好、最坏和平均时间复杂度均为O(nlogn)。

7.归并排序(MergingSort)

1)基本思想:将含有n个记录的待排序序列分解成n个子序列(每个序列只有一个元素),再两两子序列归并为一个有序新子序列,然后对这些新子序列两两归并为新的有序子序列,……,依此类推,直到最后所有的子序列都归并为一个有序序列为止。

2)最好、最坏和平均时间复杂度均为O(nlogn)。

8.快速排序(QuickSort)

1)基本思想:每一趟排序都将待排序序列a分成2个子序列,其中一个子序列a1的所有记录均比另一个序列a2的所有记录要小,接着对这两个子序列a1、a2分别分解成两个子序列,使得由a1分解出来的a3子序列的所有记录均比a1分解出来另一个子序列a4的所有记录要小,a2分解出来的a5子序列的所有记录均比a1分解出来另一个子序列a6的所有记录要小,然后再对a3、a4、a5、a6分别分解成两个独立的子序列,……,依此类推,直到所有子序列不可再分解为止。

2)最好、平均时间复杂度均为O(nlogn),最坏时间复杂度均为O(n2)。

9.小结(Summary)

希尔排序是直接插入排序的升级版,堆排序是简单选择排序的升级版,快速排序是冒泡排序的升级版。快速排序和归并排序可使用递归实现。


原文转载出处:http://50vip.com/blog.php?i=194


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值