十大经典排序算法(个人学习总结)

十大经典排序算法

最近想要学习一些基础的算法,总结出的一些简单的描述。

1.冒泡排序

首先,交代一下最简单的冒泡排序,这种排序就是重复地遍历数列,通过不断地比较相邻的两个数之间的大小,小的前移大的后移,然后不停地重复这一步,直到所有的步骤都不在需要交换了,排序也就完成了。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

2.快速排序

(1)快速排序主要是在所有的数中定义一个基准,通常是大小处于最中间的数,
(2)然后遍历所有数,比基准大的放在基准后,小的放在基准前(相同的数可以放到任意一边),这个操作称为分区操作。
(3)不断地对分出来的区域做(2)的操作。
这边有个大佬的动图非常地生动形象。(地址:https://blog.csdn.net/weixin_42109012/article/details/91645051
Alt
例:
3 , 14, 56, 35, 26, 1;
3 , 14, 56, 35, 26, 1;
3 , 14, 1 , 26, 56, 35;
3 , 14, 1 , 26, 56, 35;
1 , 3 , 14. 26, 35, 56;

3.插入排序

插入排序和选择排序一样将整个数组分为两个部分:已排序和未排序,默认第一个数在已排序之中,从未排序数列的第一个数开始依次比较之前的数(即已排序的数,从后往前),如果已排序的数大,则将已排序的数后移一位,不断比较,直到已排序的数小于或等于未排序的数,将未排序的数插入已排序的数之后。
例:从小到大选择排序;
3 , 14, 56, 35, 26, 1;
3 , 14, 56, 35, 26, 1;
3 , 14, 56, 35, 26, 1;
3 , 14, 35, 56, 26, 1;
3 , 14, 26, 35, 56, 1
1 , 3 , 14, 26, 35, 56

4.希尔排序(Shell Sort)

该方法因 D.L.Shell 于 1959 年提出而得名,第一个突破O(n2)的排序算法,是简单插入排序的改进版。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。
希尔排序的理解容易,解释就比较抽象了,我从网上一位大牛的博客找了一幅动图来解释。(地址:https://www.cnblogs.com/onepixel/articles/7674659.html

Alt
简单的来说希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止。
例:
3 , 14, 56, 35, 26, 1;
3 , 14, 56, 35, 26, 1
3 , 14, 1, 35, 26,56;
3 , 14, 1, 35, 26,56
1 , 14, 3 , 35, 26, 56;
接下来就是简单的插入排序:
1 , 14, 3 , 35, 26, 56;
1 , 14, 3 , 35, 26, 56;
1 , 3 , 14, 35, 26, 56;
1 , 3 , 14, 35, 26, 56;
1 , 3 , 14, 26, 35, 56;
1 , 3 , 14, 26, 35, 56;

5.选择排序

选择排序也是一个比较简单的直观的算法,举个直观的例子,将一群数列排序,要求从大到小排,那么选择排序就是先在这组数列中找出最大的数,并与第1个数交换位置,从现在开始整个数列就分成了两个部分:有序区和无序区,然后再在无序区找到最大的数与无序区的第1个数交换位置,并加入有序区,不断地重复这一操作,最后就可以得出要求的排序了。从小到大排序亦然。
例:从小到大选择排序;
3 , 14, 56, 35, 26, 1
1 , 14, 56, 35, 26, 3
1 , 3 , 56, 35, 26,14;
1 , 3 , 14, 35, 26, 56;
1 , 3 , 14, 26, 35, 56;
1 , 3 , 14, 26, 35, 56;
1 , 3 , 14, 26, 35, 56;

6.堆排序

堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的平均时间复杂度均为O(nlogn),它也是不稳定排序。
说实话,看见堆排序的时候我人开始是懵逼的,本身二叉树没学什么太深奥的内容,没想到能够用在这儿,仿佛打开了新的天地一般。
果断上网找了大佬的文章:https://www.cnblogs.com/chengxiao/p/6129630.html
作为小白的我无助躺尸。大佬不愧是大佬,介绍详细,清晰易懂。
简单地说一下我的理解,堆排序本质上是将待排序的数列构成一个大顶堆(注:堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。),此时整个数列的最大值就是堆顶的根节点,将其与末尾元素交换,此时末尾就是最大值,将末尾分离,剩下的元素就构成一个新的堆,重复之前的操作,直至最后,已然排序完毕。

7.归并排序

归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法的一个非常典型的应用。
归并操作,也叫归并算法,指的是将两个顺序序列合并成一个顺序序列的方法。
先将数列两两分组,互相比较,大小换位,前小后大,再将分组两两比较,数次重复合并为一个总的分组。
例:
3 , 14, 56, 35, 26, 1;(比较3次)
{3 , 14}, {35, 56}, {1, 26};(结果)
{3 , 14, 35, 56}, {1, 26};(比较2次)
{1 , 3 , 14, 26, 35, 56};(比较4次)

8.计数排序

计数排序不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。
(1)找出数列的范围;
(2)在有范围的基础上,统计每个数出现的次数;
(3)从小到大将范围中的数依次输出,直到次数为0;
动图如下:(地址:https://www.cnblogs.com/onepixel/articles/7674659.html
Alt

9.桶排序

个人感觉桶排序就是计数排序的一个进阶,计数排序只能排序整数,而桶排序就是制造一个可以放入数的“桶”,将类似或者一样的数放入同一个“桶”内,再把每个桶拼接起来。不在拘泥于整数。
下面是百度百科的一幅图,清晰解释。
Alt

10.基数排序

首先确定最大值的位数;从低位开始排序,顺序收集,再按高一级位开始排序顺序收集,直到最高位的排序收集完毕,排序也就好了。
话不多说,动图是真的香:(来源:https://www.cnblogs.com/onepixel/articles/7674659.html#!comments)
Alt

总结

本次学习总结出所谓的结论或许不太清晰,有待改进,参考大量文章的来源,有百度百科,博客等,如有任何不对之处,请斧正,谢谢。
还有我发现,动图真的是个好东西!!可以清晰明了。

参考网址

大量动图讲解:https://www.cnblogs.com/onepixel/articles/7674659.html#!comments
堆排序详解:https://www.cnblogs.com/chengxiao/p/6129630.html
还有百度百科!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值