数据结构(排序)2021-06-13

数据结构C语言版 第八章 排序

内部排序

1、插入排序 :直接插入排序、折半插入排序、希尔排序
2、交换排序: 冒泡排序、快速排序、
3、选择排序: 简单选择排序、树形选择排序、堆排序

时间复杂度都为平均时间复杂度

直接插入排序:从初始关键字开始,每次加入一个新的关键字,直接与前面的关键字进行有序比较并插入到合适位置。(扩大有序记录,把新扩入的关键字直接插入到合适位置)时间复杂度O(n2) 空间复杂度 O(1)

折半插入排序:与直接插入类似,区别在于直接插入是通过顺序查找法在已排好的序列中寻找合适的插入位置,而折半插入是根据上章所讲的折半查找的方式寻找合适的插入位置。时间复杂度O(n2) 空间复杂度 O(1)

希尔排序:“缩小增量排序”通过把一组初始关键字进行分组,对每组分别进行直接插入。注意:如果增量是5 ,不是把从第一个关键字到第6个关键字之间的5个关键字进行直接插入排序,而是每间隔5个关键字的这些个关键字为一组,将他们进行直接插入排序。时间复杂度O(n1.3) 空间复杂度O(1)

冒泡排序:通过两两比较关键字,发现逆序则进行交换,使关键字小的记录像气泡一样往上“移动”(左移)或者使关键字大的记录往下“沉”(右移)时间复杂度时间复杂度O(n2) 空间复杂度 O(1)

快速排序:为改进冒泡排序每一趟只能消除一个逆序,用快速排序,选一个关键字为支点,把其余关键字与之比较,比它小的放到左边子表,比它大的放到右边子表,最后把支点放在中间位置,这样下来一趟就能消除多个逆序,再对每个子表进行同样操作,直至每个子表只有一个记录时,排序完成。时间复杂度时间复杂度O(nlog2n) 空间复杂度O(log2n)

简单选择排序:也称直接选择排序。从第一个位置开始,从所有关键字中比较出最小的关键字放在第一个位置,再从剩余的关键字中选择出最小的关键字,以此类推把有序序列选出来。时间复杂度时间复杂度O(n2) 空间复杂度 O(1)

堆排序:堆排序是树形选择排序的改进,把初始序列对应的一维数组(即以一维数组做此序列的存储结构)看成是一个完全二叉树,主要步骤是:1、初建堆:先把无序序列建成一个堆(完全二叉树)要求每个子树都满足堆的条件(树中所有非终端结点的值均不大于(或不小于)其左右孩子结点的值)
2、调整堆:建成的堆堆顶为最大值或者最小值,此时输出(去掉)堆顶元素,要把剩余元素调整为一个满足条件的新堆。时间复杂度时间复杂度O(nlog2n) 空间复杂度O(1)

例题:设待排序的关键字序列为{12,2,16,30,28,10,16*,20,6,18}
1、直接插入排序

简单粗暴从第二个开始与前面比,找合适位置插入

[ 12 ] 2 16 30 28 10 16* 20 6 18

[ 2 12 ] 16 30 28 10 16* 20 6 18

[ 2 12 16 ] 30 28 10 16* 20 6 18

[ 2 12 16 30 ] 28 10 16* 20 6 18

[ 2 12 16 28 30 ] 10 16* 20 6 18

[ 2 10 12 16 28 30 ] 16* 20 6 18

[ 2 10 12 16 16* 28 30 ] 20 6 18

[ 2 10 12 16 16* 20 28 30 ] 6 18

[ 2 6 10 12 16 16* 20 28 30 ] 18

[ 2 6 10 12 16 16* 18 20 28 30 ]

2、希尔排序增量选取5、3、1

d=5

在这里插入图片描述

一趟排序结果 10 2 16 6 18 12 16* 20 30 28

d=3
在这里插入图片描述

二趟排序结果 6 2 12 10 18 16 16* 20 30 28

d=1

三趟排序结果 2 6 10 12 16 16* 18 20 28 30

3、冒泡排序
小的关键字往上飘,大的关键字往下沉

在这里插入图片描述
第七趟没有交换的关键字,证明序列已经有序,所以将剩余关键字全部输出。

4、快速排序

12 2 16 30 28 10 16* 20 6 18

一般选择第一个关键字为枢轴(支点)
第一趟 选择12 比12小的在左边,比12大的在右边![在这里插入图片描述](https://img-blog.csdnimg.cn/20210613123223800.png
该序列就被分为比12小的左子表,比12大的右子表,左右子表仍根据此方法直到子表内只有一个关键字时结束
在这里插入图片描述

5、简单选择排序

从序列中选出最小的放到第一个位置,次小的放第二个…以此类推

2 [ 12 16 30 28 10 16* 20 6 18]

2 6 [12 16 30 28 10 16* 20 18]

2 6 10 [12 16 30 28 16* 20 18]

2 6 10 12 [ 16 30 28 16* 20 18]

2 6 10 12 16 [ 30 28 16* 20 18 ]

2 6 10 12 16 16* [ 30 28 20 18]

2 6 10 12 16 16* 18 [ 30 28 20 ]

2 6 10 12 16 16* 18 20 [ 30 28 ]

2 6 10 12 16 16* 18 20 28 [ 30 ]

2 6 10 12 16 16* 18 20 28 30

6、堆排序
把无序序列按照一层一层的画成完全二叉树,然后再根据初建堆的条件(根结点比叶子结点大)把二叉树调成。然后把根结点和最后一个结点交换,交换完后,堆的条件破坏,根节点不是最大的,所以就进行调整,把小的结点往下调,把最大的结点往上推,调整为新的堆。

在这里插入图片描述

在这里插入图片描述

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值