数据结构整理(2)——— 比较类排序算法


对之前学的一些知识点做个总结,比较简略。记录一些容易忘记的点。
本文主要根据现有知识总结非线性时间比较类排序算法。主要可以分为四大类:插入排序(直接插入排序 Insertion Sort、希尔排序 Shell Sort),交换算法(冒泡算法 Bubble Sort、快速排序 Quick Sort),选择排序(简单选择排序 Selection Sort、堆排序 Heap Sort),归并排序 Merge Sort(二路归并排序、多路归并排序)
参考文章: [C语言实现八大排序算法(一)](https://blog.csdn.net/bluesliuf/article/details/89043746?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161533578616780274140864%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=161533578616780274140864&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-1-89043746.first_rank_v2_pc_rank_v29&utm_term=%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95)
[C语言实现八大排序算法(二)](https://blog.csdn.net/bluesliuf/article/details/89055198)

插入排序

直接插入排序 Insertion Sort

1.基本思想

将待排序的数列看成一个仅含有一个元素的有序数列和无序数列,将无序数列中的元素依次插入到有序数列中,放到正确的位置上去。

2. 复杂度

  • 时间复杂度为O(n2):有两个for循环,从第二个元素开始遍历每一个元素;对于每一个元素,让它与之前的元素进行比较,知道找到正确的位置。(Best-case 0(n);worst-case O(n2); average O(n2))
  • 空间复杂度0(1):都在原来的数组中做赋值或者交换的操作,不需要用到别的空间。

3.拓展:折半插入排序

折半查找到插入位置

希尔排序 Shell Sort

简单插入排序的优化,分组的简单插入排序

1.基本思想

相隔一个gap进行分组,组内进行插入排序;不断减小gap,直到每组只有一个元素。

2. 复杂度

  • 时间复杂度为O(n(1+e),0<e<1):有两个for循环,每一次循环一整个能排好一个的顺序,最多要排e次 ;gap越小,需要交换的次数越少,越接近best case
  • 空间复杂度0(1):都在原来的数组中做交换的操作,不需要用到别的空间。

交换排序

冒泡算法 Bubble Sort

1.基本思想

从第一个开始向后比较,大的交换到后面,保留较大的那一个再向后

2.复杂度

  • 时间复杂度为O(n2):有两个for循环,每一次循环一整个能排好一个的顺序,要排n次
  • 空间复杂度0(1):都在原来的数组中做交换的操作,不需要用到别的空间。

3.拓展:鸡尾酒排序

排序时是以首尾双向在序列中进行排序,左右同时进行排序,最左最右同时排好。

快速排序 Quick Sort

1.基本思想

选择一个pivot,根据比pivot大和比pivot小把无序数列分成左边的和右边的,然后再对这两个无序数列重复之前的操作

复杂度

  • 时间复杂度为O(nlogn)
  • 空间复杂度0(logn)

选择排序

简单选择排序 Selection Sort

1.基本思想

每次找到第i小的,然后和第i位交换

复杂度

  • 时间复杂度为O(n2):有两个for循环,每一次循环一整个找到第i小的,要找i次
  • 空间复杂度0(1):都在原来的数组中做交换的操作,不需要用到别的空间。

堆排序 Heap Sort

1.基本思想

利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。常用于top-k的问题。
把所有数加入到heap中再extract出来最大值

复杂度

  • 时间复杂度为O(nlogn):insertion和deleteMin都需要logn的时间
  • 空间复杂度0(1):都在原来的数组中做交换的操作,不需要用到别的空间。

归并排序 Merge Sort

二路/多路

1.基本思想:

分治的思想。分:对半分开;治:把两个有序数列合并成一个。从小到大一一比较。

2.复杂度

  • 时间复杂度为O(nlogn):
  • 空间复杂度0(n):combine的时候用到了一个新的数组

总结

排序法平均时间最坏情况最好情况空间复杂度备注
insertion sortO(n2)O(n2)O(n)O(1)适合大部分已经排序好的
冒泡排序O(n2)O(n2)O(n)O(1)适合n比较小的时候
快排O(nlogn)O(n2)O(nlogn)O(logn)n较大时比较好
直接选择O(n2)O(n2)O(n2)O(1)n较小时比较好
heap sortO(nlogn)O(nlogn)O(nlogn)O(1)n较大时比较好
merge sortO(nlogn)O(nlogn)O(nlogn)O(n)n较大时比较好
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值