【数据结构】排序算法总结

引子:

最近老东家要阵亡了,出来另谋生路。
大家有时会觉得数据结构工作中用不到,而且算法知识也很难全记住。
很多算法都是双层for循环,大概能记个样子,动手写基本是扑gai的。
虽说,是这样,像梦一场…但是掌握思想还是要的,不能像咸鱼一样(闷头搬砖)。
少年的志向是星辰大海。。。

TIPS:

lz也记不住,上学时就没学透,网上资料参差荇菜。最后翻出上学时的书(看纸质书还是很重要的),感觉有点门了。
要点:先把排序算法分类,分类很重要,就像知识梳理,理着理着就清晰了。
思想:是先看书->消化算法->自己组织语言敲出来,如果有理解偏差,大家回去对照着书看,也可留言(lz及时修正)。
PS:希望大家找到自己的有效学习记忆方法哈!!!lz这个分类是从上学的书上目录搬下来的,可能只适合用过这套书学习的,这里晒出来给大家参考。
PPS:记得高中一个物理NB老师经常说:领会精神!领会精神!给大家5分钟领会精神!!!
下边顺着排序算法的分类大家领会思想…

排序算法分类:

  1. 内部排序
    1. 插入排序
      1). 直接插入排序
      2). 折半插入排序
      3). 希尔排序
    2. 交换排序
      1). 冒泡排序
      2). 快速排序
    3. 选择排序
      1). 简单选择排序
      2). 堆排序
    4. 归并排序
    5. 基数排序
  2. 外部排序
    1. 置换选择排序
    2. 多路归并

1.插入排序——直接插入排序

思想:把n个待排序的序列看成一个有序表和一个无序表;开始有序表只有一个元素,无需表有n-1个元素;排序过程即每次从无需表中取出第一个元素,将它插入有序表中,使之成为新的有序表。重复n-1次完成整个排序过程。

2.插入排序——折半插入排序

思想:对直接插入排序的改进,原理同,区别在于:在有序表中寻找待排序元素的位置是,使用了折半/二分查找

折半查找只是减少了比较次数,但是元素的移动次数不变。折半插入排序平均时间复杂度为O(n^2);空间复杂度为O(1);是稳定的排序算法。

3.插入排序——希尔排序

思想:也是对直接插入排序的改进,本质上是一种分组插入排序。
没有交换,只有移位;分组对比移位直接插入

4.交换排序——冒泡排序

思想:从第二个数开始,依次比较交换两个数;第一次只能确定一个最大的元素(默认升序),每次只能确定一个数据的位置,n个数据需要n-1趟比较/交换。

5.交换排序——快速排序

思想:选取一个基数(默认第一个元素),跳跃式交换元素,使小于基数的元素都在左边大于基数的元素都在右边(默认升序);二分递归思想,至序列有序。

6.选择排序——简单选择排序(直接选择排序)

思想:第一次选择序列中最小的元素并取出,每次从剩下的序列中选择一个最小的元素取出;
对比“冒泡排序”,减少了很多交换操作,并未减少对比操作。
复杂度O(n^2)

7.选择排序——堆排序

思想:考虑简单选择排序,中间有很多对比操作,并未对排序起到实际的影响效率作用。如何使这么多对比操作,提高排序效率,这就是堆排序。

8.归并排序

思想:第一次把序列分为等量的两组子序列,然后继续递归进行子序列分组,知道分成子序列只有一个数据,进行递归回溯对比合并序列,最终完成排序。又叫二路归并排序。

======华丽分割线======以上8中排序均为以比较为基础的排序算法======

比较为基础的排序算,在时间效率上市有下界的。
结论:下届就是O(nlogn);
所以时间复杂度达到O(nlogn)的排序算法已经是理论上最优的比较排序算法了。
参考书中(a,b,c),三个元素的排序,可以建立一个比较二叉判定树。n个元素有n!中排列方式,可计算比较排序的效率下届O(logn!)≈O(nlogn)。

9.基数排序(新世界,新思想)

思想:比较元素,而是根据元素的多个特征(多关键字)加入特征属性对比;比如扑克牌花色排序规则:♣<♦<♥<♠,元素数值排序规则:2<3<…A。这样可以根据花色先进性花色分堆,然后再根据元素数值进行排序。
种类:
1.高位优先法(MSDF)2.地位优先法(LSDF)

10种排序算法对比

算法 名称比较 次数 ( 最 坏 、 平 均 、 最 坏 )移动/交换次数(最好、最坏)辅助空间稳定性
排序算法最好时间平均时间最坏时间最好情形最坏情形辅助空间稳定性
直接插入排序O(n)O(n^2)O(n^2)0O(n^2)O(1)稳定
折半插入排序O(nlogn)--0O(n^2)O(1)稳定
希尔插入排序-O(n^1.3)-0O(n^2)O(1)不稳定
冒泡排序O(n)O(n^2)O(n^2)0O(n)O(1)稳定
快速排序O(nlogn)O(nlogn)O(n^2)O(nlogn)-O(logn)不稳定
简单选择排序O(n^2)O(n^2)O(n^2)0O(n^2)O(1)不稳定
堆排序O(nlogn)O(nlogn)O(nlogn)O(logn)O(n^2)O(1)不稳定
归并排序O(nlogn)O(nlogn)O(nlogn)O(nlogn)-O(n)稳定
基数排序(基于链式队列)O(dn)O(dn)O(dn)--O(n)稳定
基数排序(基于顺序队列)O(dn)O(dn)O(dn)--O(n)稳定

参考:
基本排序(二)插入排序(直接插入、Shell、折半

经典排序算法(4)——折半插入排序算法详解

希尔排序

十大经典排序算法(动图演示)

排序算法总结

十大编程算法助程序员走上高手之路

参考书籍:

《数据结构、算法及应用》张宪超

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值