内部排序——数据结构复习

注:本片文章所有图片链接等仅供学习使用,无任何商业盈利用途。

内部排序

排序:
有两套序列,
一套序列{r1, r2, ……, rn}是用于记录外在的序列的形式,也就是这个序列的第1、2、3......个数字的记录者,但是这个序列并不能保证按照大小关系等规则进行排序,只是将数字按照一定的编号串联起来而已。
另一套序列{k1, k2, ……, kn}是记录序列中某个元素所代表的真正的值的也就是 key 值。
在排序过程中,更换的是 ri 与 rj ,但是实际上换的是内部的 ki 、kj ,更换后的 ri 内部包含的实际上是原来的 rj ,相应的 ki 也就是变成了 kj 。

至于为什么不直接比较k1 k2 k3......
ri用于表示次序,ki用于体现大小

升序: 降序:
稳定的排序和不稳定的排序        
内部排序和外部排序:取决于排序过程中数据对象是否完全在内存中
基于比较和不基于比较的排序:
关键字的比较和记录的移动, 

 

冒泡排序

每次过去一趟一定浮上去一个最小(大)的

需要注意的点:
1.sp的使用
2.swap函数中输入的是地址,而不是只是两个需要将交换的元素
时间复杂度:

空间复杂度O(1)
冒泡排序稳定

快速排序
同样是一种交换排序,但是其相对于冒泡排序的优点是交换的跨度变大,而不是只是跨度为1

重点步骤:

1基准元素的选取

2通过基准元素得到左右两部分,左侧小于等于v,右侧大于等于v
3递归:新得到的左右两个部分分别进行新的排序

时间复杂度:

最好情况的时间复杂度n*log_2 n 空间复杂度 log_2 n(使用递归工作栈)
最坏情况

 平均情况:时间复杂度n*log_2 n 空间复杂度 log_2 n
(和最好情况一样)

**快排为不稳定排序


快排是平均性能最好的内排序方法。


选择排序👆
题目:


默认全是升序?从后向前与从前向后是指气泡的移动方向?确实!

问题:

这种快速排序是默认第几种排序方式呢?

下列选项中,不可能是快速排序第2趟排序结果的是 ()__牛客网 (nowcoder.com)https://www.nowcoder.com/questionTerminal/0e322ea03d0d4b318403c7119a18e5a1另外为什么每一次快排之后都会至少有一个元素的位置正确呢,他是采取的什么方式取得pivot呢

解释:pivot的选择与最后答案无关,因为最后无论pivot在哪,都是在一趟之后放在中部的位置。

所以说,两趟之后一定有两个是符合顺序的。

另例:

题解:

例题:

引用网站:已知由n(n≥2)个正整数构成的集合A={ak|0≤k<n},将其划分为两...__牛客网 (nowcoder.com)https://m.nowcoder.com/questionTerminal?uuid=7529cd3f28344f5da5f71a95c0b76ea4直接选择排序

比较容易
 

时间复杂度:O(n^2),主要花在寻找最小值的上面,空间复杂度O(1)
堆排序

 
堆的定义:大顶堆:爸爸比儿子数大、小顶堆:爸爸比儿子数小
注意:堆都是完全二叉树

初始堆

堆元素插入:就是插入新元素作为最右侧叶子,然后进行调整
调整函数:就是选择每d个元素的儿子中最大的那个(如果是最大堆),如果出现了那种底下的元素的大小大于根节点的元素,就要调换二者,并且循环看看接下来的儿子是否还会出现类似的问题
初始建堆:就是从最后面的一个序号节点往前分别找自己的树(向上一层)然后进行调整函数。
堆排序:将堆顶元素与最右面的叶子进行互换,然后删除那个堆顶元素(现在在最右面的叶子处),然后进行调整堆的操作。->需要注意的是,这个是堆排序需要循环n-1次,也就是最后输出了全部的数字(最后剩下一个就不用继续操作,所以少整一个)

为甚么!!!初始建堆的时候需要从后向前进行依次调整 而之后的堆排序就不用?
原因:初始堆建立的时候可以将所有的堆的元素设置一个正确的序列,打下了基础,后面删除叶子结点之后再进行的调整只是小范围的调整,因为除了那一个数字之外,其他的元素仍然按照正确的排列方式,因此只需要小范围的调整即可,如果顺序不正确,也只是更换了根节点的子树需要进行调整。(类似地, 向堆中插入新节点, 只需要放在最右端叶子的位置, 然后向上 【类似{log2 n次的}  "堆的调整"向下循环进行调整的时候】进行比较、替换等操作即可,无需重建堆)

堆排列适合关键字n较多的情况 如:n>1000
例题:

 
堆排比较:左右儿子都要比,才能看出来哪个儿子更小,用来与根节点交换。

直接插入排序

有关直接插入排序的改进:折半插入排序(参考下链接)
详解折半插入排序算法 - tensory - 博客园 (cnblogs.com)https://www.cnblogs.com/tensory/p/6590799.html

数据结构与算法系列——排序(3)_折半插入排序 - 海米傻傻 - 博客园 (cnblogs.com)https://www.cnblogs.com/haimishasha/p/10841044.html#:~:text=1.%20%E6%97%B6%E9%97%B4%E5%A4%8D%E6%9D%82%E5%BA%A6%20%E4%B8%8D%E9%9A%BE%E7%9C%8B%E5%87%BA%EF%BC%8C%E6%8A%98%E5%8D%8A%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA%8F%E4%BB%85%E4%BB%85%E6%98%AF%E5%87%8F%E5%B0%91%E4%BA%86%E6%AF%94%E8%BE%83%E5%85%83%E7%B4%A0%E7%9A%84%E6%AC%A1%E6%95%B0%EF%BC%8C%E7%BA%A6%E4%B8%BAO%20%28nlogn%29%EF%BC%8C%E8%80%8C%E4%B8%94%E8%AF%A5%E6%AF%94%E8%BE%83%E6%AC%A1%E6%95%B0%E4%B8%8E%E5%BE%85%E6%8E%92%E5%BA%8F%E8%A1%A8%E7%9A%84%E5%88%9D%E5%A7%8B%E7%8A%B6%E6%80%81%E6%97%A0%E5%85%B3%EF%BC%8C%E4%BB%85%E5%8F%96%E5%86%B3%E4%BA%8E%E8%A1%A8%E4%B8%AD%E7%9A%84%E5%85%83%E7%B4%A0%E4%B8%AA%E6%95%B0n%EF%BC%9B%E8%80%8C%E5%85%83%E7%B4%A0%E7%9A%84%E7%A7%BB%E5%8A%A8%E6%AC%A1%E6%95%B0%E6%B2%A1%E6%9C%89%E6%94%B9%E5%8F%98%EF%BC%8C%E5%AE%83%E4%BE%9D%E8%B5%96%E4%BA%8E%E5%BE%85%E6%8E%92%E5%BA%8F%E8%A1%A8%E7%9A%84%E5%88%9D%E5%A7%8B%E7%8A%B6%E6%80%81%E3%80%82,%E5%9B%A0%E6%AD%A4%EF%BC%8C%E6%8A%98%E5%8D%8A%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA%8F%E7%9A%84%20%E6%97%B6%E9%97%B4%E5%A4%8D%E6%9D%82%E5%BA%A6%E4%BB%8D%E7%84%B6%E4%B8%BAO%20%28n%C2%B2%29%20%EF%BC%8C%E4%BD%86%E5%AE%83%E7%9A%84%E6%95%88%E6%9E%9C%E8%BF%98%E6%98%AF%E6%AF%94%E7%9B%B4%E6%8E%A5%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA%8F%E8%A6%81%E5%A5%BD%E3%80%82二分排序算法:
这个算法的时间复杂度仍然是O(n^2),虽然看着比较的次数变成了n*log_2 n,但是插入的过程中,插入部位之后的移动次数仍然没有变。

希尔排序也就是逐步缩减步长gap的一种排序,根据gap的大小得到很多组序列,分别排序,最后将gap缩减为1,实现整体的排序。 

以上就是通过缩减gap得到的希尔排序的算法。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值