八大排序入门

直接插入排序:每次从待排序序列中取值,放到已排序好的序列中(放完之后保证依旧有序)

时间复杂度O(n平方) 空间复杂度 O(1)
稳定性:稳定
观察是否稳定方法:查看是否存在跳跃交换 (稳定性:如果相同的两个值,A和B,如果排序前A 在B之前,排序后仍然在B之前称为稳定)
优点:1.实现简单 2.数值个数少使用直接插入排序
特点:数据越有序,排序越快

希尔排序:(shell) 也叫缩小增量排序,是对于直接插入排序的优化

时间复杂度: O(n的1.5~1.7次方)
空间复杂度: O(1) 稳定性:不稳定
选取增量数组[5,3,1] (注意:最后一个增量必须为1,没有除1之外的公因子,也就是互素)
直插和希尔比较:(按一万个数据来说)
直接插入排序 10000的平方=100000000
希尔排序分为5,3,1组,
2000*5 2000的平方 5 =20000000
3333
3 3333的1.7方 3 约等于3000000
10000
1 10000的15方 *1 =1000000 总计:24000000 < 100000000
所以如果数据量非常大,希尔排序是对直接插入排序做了优化

隔5个数一组;
在这里插入图片描述
在这里插入图片描述
隔3个数一组;

在这里插入图片描述在这里插入图片描述
隔1个数一组排序,排完就完全有序了
在这里插入图片描述
在这里插入图片描述

冒泡排序 Bubble Sort

时间复杂度 O(n的平方) 空间复杂度O(1)
稳定性:稳定
len个值,len-1趟遍历
每一趟两两交换,默认升序从小到大,从左向右两两比较,如果左边值大于右边值,则交换
每一趟就可以把最大值换到最后,下一次就可以不比较最后一个值,因为它已经是最大的
特殊情况:在挪动过程中,发现在最后一趟之前的某一趟的时候已经全部有序了,可不可以优化呢?
解决:添加一个bool标记,如果没发生交换,直接就返回

归并排序 Merge Sort

时间复杂度O(nlogn) 空间复杂度O(n)
稳定性:稳定
在这里插入图片描述

只有所有数据都在一个组才完全有序
先将所有数据一一分组,然后再两两合并,如果一个组只有一个数值,则其有序,如果每组中有相同数值,先下左边数据

推排序 Heap Sort

堆排序的一次调整时间复杂度 O(nlogn) 空间复杂度O(1) 稳定性:不稳定
大顶堆: 父节点值大于孩子节点
小顶堆 父节点值小于孩子节点
二叉树:
根节点:最上面的结点
父节点
孩子节点
叶子节点
1.将arr数组里的数据想象成一个二叉树
在这里插入图片描述
2.将所有的小顶堆其调整成为大顶堆(从最后一个非叶子节点开始调整,从后向前,从下向上),此时最大的值成为了根节点
3.将根节点的值放到数组末尾(最后一个叶子节点)
在这里插入图片描述

4.重复2,3操作,直到大顶堆只剩下一个节点(只剩下一个有效数据),但是此时不需要再按CBA顺序调整大顶堆,只需要调整A

怎么用父节点的下标推出两个孩子节点的下标
0-> 1 2
1->3 4
2->5 6

假设父节点是 i 子节点 2i+1 2i+2

怎么用子节点的下标推出父节点的下标
假设子节点是 i 父节点 (i-1)/2

选择排序

时间复杂度O(n平方) 空间复杂度O(1) 稳定性:不稳定
规则:每次遍历找到最小的值和待排序序列的第一值交换

基数排序 :桶排序

假设位数为d位 时间复杂度O(d*n) 空间复杂度O(n) 稳定性:稳定
模仿队列尾插头删
分别按位数放入十个队列中,适用于位数少的一组数据
将所有数据从第一位开始排序(个位开始),个位、十位、百位,判断需要进行几次排序,是通过最大值的位数,比如999 需要三次排序
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
这个时候取值出来的数组已经有序了

快速排序

越有序越慢,越乱越快
时间复杂度最差O(n平方) 平均时间复杂度O(nlogn)
空间复杂度O()
![在这里插入图片描述](https://img-blog.csdnimg.cn/f7da52474df34c308b2642e1e1a4b849.png在这里插入图片描述
快速优化:让数据更快,让数据更乱

优化1.首先判断数组有多少个数据,如果len较小,则直接调用直接插入排序
优化2.三数取中法,取数组第一个值,中间位置的值,最后一个值
if(arr[left]>arr[mid]) swap(arr[mid],arr[right])
if (arr[mid]>arr[right]) swap(arr[mid],arr[right])
if(arr[left]<arr[mid]) swap(arr[mid],arr[left])
优化3.随机种子,把数组里随机任意一个值放到最前面

3.非递归实现快排

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值