【数据结构】内排序小结

“ Ctrl AC!一起 AC!”

目录

排序码与关键码

插入排序

直接插入排序

二分法插入排序

 表插入排序

Shell插入排序(希尔排序)

选择排序

直接选择排序

树型选择排序

堆排序 

交换排序

冒泡排序

快速排序

快速排序

归并排序

基数排序


排序码与关键码

排序码:以此码作为比较进行排序 

关键码:能唯一标识一个记录的字段称为关键码

比如(可能不恰当)

a b c d 这一序列

排序码是它们在字母表中的顺序

关键码是它们本身"a" "b" "c" "d"

插入排序

插入排序的基本方法是:将待排序文件中的记录,逐个地按其排序码值的大小插入到目前已经排好序的若干个记录组成的文件中的适当位置,并保持新文件有序。

直接插入排序

思路:初始可认为文件中的第一个记录已排好序,然后将第二个到第n个记录依次插入到已排序的记录组成的文件中。

将当前待排序的元素与已排序好的元素序列作比较,若已排好序的序列的最后一个元素小于等于当前元素,则当前元素的排序结束,轮到当前元素的下一个元素排序,否则,已排好序的序列的最后一个元素往后移一位继续将当前元素与已排好序的序列的倒数第二个元素进行比较。下标为0处放一个当前元素是为了防止越界。

二分法插入排序

思路:在找到第i个记录的插入位置时,前i-1个记录已排序,将第i个记录的排序码key[i]和已排序的前i-1个的中间位置记录的排序码进行比较,如果key[i]小于中间位置记录排序码,则可以在前半部分继续使用二分法查找,否则在后半部分继续使用二分法查找。直到查找范围为空,即可确定key[i]的插入位置。

 表插入排序

思路:表插入排序将在不进行记录移动的情况下,利用存储结构有关信息的改变来达到排序的目的。为此,可以给每个记录附设一个指针域 link,它的类型为整型,表插人排序的思路是,在插人第i个记录R,时,R, R2, ...... Ri-1已经通过各自的指针域link按排序码不减的次序连接成一个 (静态链)表,将记录R;的排序码key;与表中已经排好序的排序码从表头向右、或称向后依次比较,找到R,应插人的位置,将其插人在表中,使表中各记录的排序码仍然有序。

下标0处的link域指向排好序的第一个元素,其他下标的link域指向该元素的下一个元素,最后一个元素的link域指向0

Shell插入排序(希尔排序)

选择排序

思想:每次从待排序的文件中选择出排序码最小的记录,将该记录放于已排序文件的最后一个位置,直到已排序文件记录个数等于初始待排序文件的记录个数为止。

直接选择排序

首先从所有n个待排序记录中选择排序码最小的记录,将该记录与第一个记录交换,再从剩下的n-1个记录中选出排序码最小的记录和第2个记录交换。重复这样的操作直到剩下两个记录,再从中选出排序码最小的记录和第n-1个记录交换。

树型选择排序

参考:树型选择排序https://blog.csdn.net/qq_16234613/article/details/52675953?ops_request_misc=&request_id=&biz_id=102&utm_term=%E6%A0%91%E5%9E%8B%E9%80%89%E6%8B%A9%E6%8E%92%E5%BA%8F&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-52675953.142%5Ev21%5Econtrol,157%5Ev15%5Enew_3&spm=1018.2226.3001.4187

堆排序 

参考:堆排序https://blog.csdn.net/m0_62434776/article/details/122930566

交换排序

思路:对待排序记录两两进行排序码比较,若不满足排序顺序,则交换这对记录,直到任何两个记录的排序码都满足排序要求为止。

冒泡排序

具体的做法是:第1趟,对所有记录从左到右每相邻两个记录的排序码进行比较,如果这两个记录的排序码不符合排序要求,则进行交换,这样一趟做完,将排序码最大者放在最后一个位置(即该排序码对应的记录最终应该放的位置).第2趟对前下的n-1个待排序记录重复上述过程,又将个排序码放于最终位置,反复进行n-1次, 可n-1个排序码对应的记录放至最终位置,剩下的即为排序码最小的记录, 它在第1的位置处。如果在某一趟中, 没有发生交换,则说明此时所有记录已经按排序要求排列完毕,排序结束。

快速排序

快速排序icon-default.png?t=M5H6https://blog.csdn.net/qq_40941722/article/details/94396010?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165603747316782184657182%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=165603747316782184657182&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-94396010-null-null.142^v21^control,157^v15^new_3&utm_term=%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F&spm=1018.2226.3001.4187


归并排序

归并排序icon-default.png?t=M5H6https://blog.csdn.net/k_koris/article/details/80508543?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165603997416782248529922%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=165603997416782248529922&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-2-80508543-null-null.142^v21^control,157^v15^new_3&utm_term=%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F&spm=1018.2226.3001.4187

基数排序

基数排序icon-default.png?t=M5H6https://blog.csdn.net/xiaoxi_hahaha/article/details/113186384?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165603914616782395331284%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=165603914616782395331284&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-113186384-null-null.142^v21^control,157^v15^new_3&utm_term=%E5%9F%BA%E6%95%B0%E6%8E%92%E5%BA%8F&spm=1018.2226.3001.4187

感谢阅读!!!

“ Ctrl AC!一起 AC!” 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1.实验目的 掌握内排序,比较各种排序的优、缺点。 2 需求分析 2.1原理 2.1.1、直接排序 算法描述:经过i-1遍处理后,L[1..i-1]己排好序。第i遍处理仅将L[i]插入L[1..i-1]的适当位置,使得L[1..i]又是排好序的序列。要达到这个目的,我们可以用顺序比较的方法。首先比较L[i]和L[i-1],如果L[i-1]≤ L[i],则L[1..i]已排好序,第i遍处理就结束了;否则交换L[i]与L[i-1]的位置,继续比较L[i-1]和L[i-2],直到找到某一个位置j(1≤j≤i-1),使得L[j] ≤L[j+1]时为止。 2.1.2、冒泡排序 算法描述:核心思想是扫描数据清单,寻找出现乱序的两个相邻的项目。当找到这两个项目后,交换项目的位置然后继续扫描。重复上面的操作直到所有的项目都按顺序排好。 2.1.3、快速排序 算法描述:首先检查数据列表的数据数,如果小于两个,则直接退出程序。如果有超过两个以上的数据,就选择一个分割点将数据分成两个部分,小于分割点的数据放在一组,其余的放在另一组,然后分别对两组数据排序。通常分割点的数据是随机选取的。这样无论你的数据是否已被排列过,你所分割成的两个字列表的大小是差不多的。而只要两个子列表的大小差不多。 2.1.4、选择排序 算法描述:首先找到数据清单的最小的数据,然后将这个数据同第一个数据交换位置;接下来找第二小的数据,再将其同第二个数据交换位置,以此类推。 2.1.5、堆排序 (1) 基本思想:堆排序是一树形选择排序,在排序过程,将R[1..N]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树双亲结点和孩子结点之间的内在关系来选择最小的元素。 (2) 堆的定义: N个元素的序列K1,K2,K3,...,Kn.称为堆,当且仅当该序列满足特性: Ki≤K2i Ki ≤K2i+1(1≤ I≤ [N/2]) 2.1.6、希尔排序 算法描述:在直接插入排序算法,每次插入一个数,使有序序列只增加1个节点,并且对插入下一个数没有提供任何帮助。如果比较相隔较远距离(称为增量)的数,使得数移动时能跨过多个元素,则进行一次比较就可能消除多个元素交换。 2.2要求 1.本程序对以下六种常用内部排序算法进行实测比较:冒泡排序,插入排序,选择排序,希尔排序,快速排序,堆排序。 2.排序的元素的关键字为整数。用正序,逆序,不同乱序的数据作测试比较。比较的指标为有关键字参加的比较次数和关键字的移动次数。 3.程序以人机对话的形式进行,每次测试完毕显示各种比较指标值 。 2.3任务 设计一个测试程序比较几种内部排序算法的关键字比较次数和移动次数以取得直观感受。 2.4运行环境 (1)WINDOWSXP系统 (2)C++ 编译环境 3.实验方法 本实验主要是内排序,通过比较的次数和移动的次数判断排序的好坏。主要子函数的说明如下。 1.简单选择排序XuanzePaixu(); 2.冒泡排序MaopaoPaixu(); 3. 直接插入排序CharuPaixu(); 4. 快速排序KuaisuPaixu(); 5. 堆排序DuiPaixu(); 6. 希尔排序 XierPaixu(); 以上的排序算法均采用书所用的算法。程序采用输入的时候仅输入所要的个数,具体的输入数据由程序随机产生个数,并且输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ctrl AC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值