注:本片文章所有图片链接等仅供学习使用,无任何商业盈利用途。
内部排序
排序:
有两套序列,
一套序列{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
(和最好情况一样)
**快排为不稳定排序
快排是平均性能最好的内排序方法。
选择排序👆
题目:
默认全是升序?从后向前与从前向后是指气泡的移动方向?确实!
问题:
![](https://img-blog.csdnimg.cn/75dacb11ca2b4fa79f9dc1e9fdca207e.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBATWlrZeWzsA==,size_20,color_FFFFFF,t_70,g_se,x_16)
这种快速排序是默认第几种排序方式呢?
下列选项中,不可能是快速排序第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
希尔排序也就是逐步缩减步长gap的一种排序,根据gap的大小得到很多组序列,分别排序,最后将gap缩减为1,实现整体的排序。
以上就是通过缩减gap得到的希尔排序的算法。