个人笔记整理——十大排序算法介绍

没有具体的实现方式,只是对算法的思想进行梳理以巩固自己的理解,(文字上)超简单的版本。要深入理解每个算法,请参考图文详解甚至代码实现的博客。


目录

1、冒泡排序

2、选择排序

3、插入排序

4、希尔排序

5、归并排序

6、快速排序

7、堆排序

8、计数排序

9、桶排序

10、基数排序


算法1、2、3最基础;5、6、7最应该掌握,面试笔试常常会问到的;8、9、10都用到“桶”的概念,对数据本身有限制。

选择排序、归并排序、堆排序、基数排序最好、最差、平均时间复杂度均相同(与序列初始状态无关),而快排与关键字的选择有关,最好和平均为Θ(nlogn),最差则为Θ(n²)。推荐关于时间复杂度与初始状态关系的博客https://www.cnblogs.com/Xieyang-blog/p/8340578.html

我在复习的时候一直参考的这篇博客https://blog.csdn.net/weixin_41190227/article/details/86600821特别详细,附上时间复杂度的总结图(也是这篇博客的)。

1、冒泡排序

遍历序列对象时,两两比较并进行交换,每一轮遍历结束后最小元素固定在了序列前端,每个未排序的最小元素“像个泡泡一样往上”找到自己正确的位置,比较过程在相邻元素间发生,最小元素上浮。

2、选择排序

将序列分为有序区域和无序区域,每次遍历过程选择无序区的min元素移到有序区。比较过程在无序区发生,选择无序区最小元素。

3、插入排序

将序列分为有序区域和无序区域,每次遍历过程取得一个无序区元素插入到有序区,比较过程在有序区发生,插入有序区合适位置。

4、希尔排序

 第一个突破Θ(n²)的排序算法,又称为缩小增量排序。将待排序列按增量分割成子序列分别进行插入排序。增量gap初始为数组(length+1)/2,修改为gap=gap/2,含义为每个元素和距离它gap距离的元素为一组,所以gap的值也是子序列的个数。

例如有十个元素的序列A,最开始被分为了(10+1)/2=5组,每组元素为(i,i+gap),分别对5组进行排序,结束之后再将A分为5/2=2组,每组元素为(i,i+2,i+2,i+2+2,...),分别对两组进行排序,结束之后再将A分为2/2=1组,每组元素为(i,i+1,i+1+1..),对该组进行排序。(希尔排序感觉有点儿绕(◎ロ◎))

5、归并排序

归并排序的过程包括“分”和“治”。“分”是将长度为n的输入序列分为n/2的子序列,子序列再继续进行划分直到不可再分。将子序列排序之后合并的过程则为“治”。

归并排序的过程需要额外的空间,所以相比于上面的四种排序算法,又称为外排序。重点在于治的过程,描述如下(用的我自己能理解的话):

 

6、快速排序

a.选取一个关键字(key)作为枢纽,一般为长度为n的序列的第一/中间/最后一个数;

b.设置两个变量left=0,right=n-1作为下标;

c.left从前往后,right从后往前,分别找到一个left的值比key大,right的值比key小的记录,然后交换,是一个双向查找的过程;

d.直到left与right"相遇",将key置于left的位置,此时left左边的值均小于key,右边的值均大于key,key在自己有序序列的正确位置,即完成一轮快排;

e.左右两边子序列重复上述过程,直到子序列不可分,即完成了对原输入序列的排序过程。

 

7、堆排序

a.将无序序列构建成一个堆,根据升序或降序排列选择大顶堆或小顶堆(下面选择大顶堆);

b.将对顶元素max与末尾元素进行交换,max沉到数组末端并“脱离”堆;

c.重新调整结构,形成新的大顶堆,再与当前末尾进行交换;

d.反复执行调整、交换过程。

堆排序除了初始建堆的过程时间复杂度为Θ(n),后面重建堆的过程根据完全二叉树的性质,时间复杂度为Θ(log2(n-1)),这个n为未排序序列长度,随着排序过程递减;而整个交换过程进行n-1次,所以时间复杂度近似为Θ(nlogn)。

 

8、计数排序

对于输入的整数序列N,使用额外数组A作为辅助工具,A[i]为N中值为i的个数,如N中有3个22,那么A[22]=3。对N中的元素计数累加放入到A[i]中(每个A[i]可以看作一个"桶",A[22]=3则想象成A[22]这个桶装了3个22),再遍历A,将A[i]个i依次排列。计数排序只能对整数进行排序,且需要额外空间,对于最大值较大的序列不适用。

 

9、桶排序

对于输入序列n,有最大值max和最小值min。

a.排序前先设置空桶的数量,如5,则每个桶存放的值的范围为(max-min+1)/5=a;

b.把每个元素放到对应的桶当中,对应计算为(n[i]-min)/a,如计算得3,则放入第3个桶;

c.对每个不为空的桶进行排序,任意其他排序算法均可;

d.将不为空的桶直接拼接。

 

10、基数排序

设置编号为0~9的10个桶,每次排序的时候将所排位相对应的数放入桶中,入排十位时,将110和318均放入编号为1的桶,完成每位的排序后将桶展开。

a.找到输入序列中的最大数max并获取max的位数;

b.按照序列的低位(个位)进行排序,只排个位;

c.再按照序列个高一位(十位)进行排序,只排十位;

d.依次进行,直到完成最高位的排序。

算法8、9、10都涉及了桶的概念,他们有使用了外部空间,都是非比较排序,排序速度快,但是对内存和数据有一定要求。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值