数据结构 排序

本文详细介绍了各种排序算法,包括插入排序(直接插入、折半插入、2-路插入和希尔排序)、交换排序(冒泡排序和快速排序)、选择排序(简单选择和堆排序)、归并排序以及基数排序。每种排序算法的时间复杂度和稳定性也进行了阐述,适合想要深入理解排序算法的读者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

按照文件所处的位置不同:
待排序的记录数不太多:所有的记录都能存放在内存中进行排序,称为内部排序
待排序的记录数太多:所有的记录不可能存放在内存中, 排序过程中必须在内、外存之间进行数据交换,这样的排序称为外部排序

插入排序

基本思想:逐个将纪录插入到已排好次序的有序表中得到一个新的有序表

直接插入排序(Straight Insertion Sort)
在这里插入图片描述
最好情况:时间复杂度:O(n) 最坏情况时间复杂度:O(n2)

折半插入排序(还是要求已经排好了) 时间复杂度O(n2)

2-路插入排序
在折半插入排序的基础上加以改进,目的是减少排序过程中移动记录的次数,但需要n个记录的辅助空间。
在这里插入图片描述
在这里插入图片描述

表插入排序
是一种不移动记录的方式,以next域作为下一个的索引
表插入排序的基本操作是将一个记录插入到已排好序的有序表中,与直接插入排序相比,不同之处是总共修改2n次指针来代替移动记录,排序过程中所需关键字比较次数相同,时间复杂度是O(n2)
表插入排序的结果存放在顺序存储结构中,但以链表形式存在,不能作如折半查找等随机查找,因此排序后还需对记录作重排。
表插入排序的结果存放在顺序存储结构中,但以链表形式存在,不能作如折半查找等随机查找,因此排序后还需对记录作重排。
在这里插入图片描述
在这里插入图片描述

希尔排序(Shell’s Sort)
是一种分组插入排序方法,先将整个待排序记录序列分割成为若干个子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。
时间复杂度为(n3/2), 算法是不稳定的
在这里插入图片描述

交换排序

冒泡排序 时间复杂度为O(n2)

快速排序:根据一个界点,通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,再分别对这两部分记录继续进行排序,以达到整个序列有序
在这里插入图片描述
在这里插入图片描述
之后再对两个部分进行分别的排序。
在这里插入图片描述

选择排序

基本思想:每次从当前待排序的记录中选取关键字最小的记录表,然后与待排序的记录序列中的第一个记录进行交换,直到整个记录序列有序为止。

简单选择排序(Simple Selection Sort):时间复杂度为O(n2)
最好情况是当排序记录序列有序时,移动记录次数是0;
最坏情况是当待排序记录序列逆序时,移动记录次数为3(n-1),算法不稳定
在这里插入图片描述

树形选择排序(Tree Selection Sort)
又称锦标赛排序(Tournament Sort);首先对n个记录的关键字两两进行比较,选取n/2(向上取整)个较小者;然后这n/2个较小者两两进行比较,选取n/4个较小者… 如此重复,直到只剩1个关键字为止。
在这里插入图片描述

堆排序(Heap Sort)
时间复杂度为O(nlog2n),是不稳定
首先把待排序的记录序列对应成一棵完全二叉树,并把它转换成一个初始堆(即首先建初始堆)。这时,根结点具有最大(或最小)的关键字值,然后,交换根结点和最后一个结点(即第n个结点)的位置,除最后一个结点之外,前n-1个结点仍构成一棵完全二叉树,再把它们调整为一个堆。同样交换根结点和最后一个结点(即第n-1个结点)。重复进行下去,直到只剩下一个根结点为止,便得一个有序表。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

归并排序

将两个或两个以上的有序序列合并成一个有序序列。
2-路归并排序,时间复杂度为O(nlog2n)
在这里插入图片描述

基数排序

又称为桶排序或数字排序,按待排序记录的关键字的组成成分(或“位”)进行排序。
基数排序,其时间复杂度为O(d*n)。
实现多关键字排序有两种常用的方法(多关键字即多个评判标准 )
最高位优先MSD (Most Significant Digit first)
最低位优先LSD (Least Significant Digit first)

链式基数排序
基数排序的“分配”与“收集”过程 第一趟 :
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结

插入排序:依次将无序序列中的一个记录,按关键字值的大小插入到已排好序一个子序列的适当位置,直到所有的记录都插入为止。具体的方法有:直接插入、表插入、2-路插入和shell排序。
交换排序:对于待排序记录序列中的记录,两两比较记录的关键字,并对反序的两个记录进行交换,直到整个序列中没有反序的记录偶对为止。具体的方法有:冒泡排序、快速排序。
选择排序:不断地从待排序的记录序列中选取关键字最小的记录,放在已排好序的序列的最后,直到所有记录都被选取为止。具体的方法有:简单选择排序、堆排序。
归并排序:利用“归并”技术不断地对待排序记录序列中的有序子序列进行合并,直到合并为一个有序序列为止。
基数排序:按待排序记录的关键字的组成成分(“位”)从低到高(或从高到低)进行。每次是按记录关键字某一“位”的值将所有记录分配到相应的桶中,再按桶的编号依次将记录进行收集,最后得到一个有序序列。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值