没有具体的实现方式,只是对算法的思想进行梳理以巩固自己的理解,(文字上)超简单的版本。要深入理解每个算法,请参考图文详解甚至代码实现的博客。
目录
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特别详细,附上时间复杂度的总结图(也是这篇博客的)。
遍历序列对象时,两两比较并进行交换,每一轮遍历结束后最小元素固定在了序列前端,每个未排序的最小元素“像个泡泡一样往上”找到自己正确的位置,比较过程在相邻元素间发生,最小元素上浮。
将序列分为有序区域和无序区域,每次遍历过程选择无序区的min元素移到有序区。比较过程在无序区发生,选择无序区最小元素。
将序列分为有序区域和无序区域,每次遍历过程取得一个无序区元素插入到有序区,比较过程在有序区发生,插入有序区合适位置。
第一个突破Θ(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..),对该组进行排序。(希尔排序感觉有点儿绕(◎ロ◎))
归并排序的过程包括“分”和“治”。“分”是将长度为n的输入序列分为n/2的子序列,子序列再继续进行划分直到不可再分。将子序列排序之后合并的过程则为“治”。
归并排序的过程需要额外的空间,所以相比于上面的四种排序算法,又称为外排序。重点在于治的过程,描述如下(用的我自己能理解的话):
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.左右两边子序列重复上述过程,直到子序列不可分,即完成了对原输入序列的排序过程。
a.将无序序列构建成一个堆,根据升序或降序排列选择大顶堆或小顶堆(下面选择大顶堆);
b.将对顶元素max与末尾元素进行交换,max沉到数组末端并“脱离”堆;
c.重新调整结构,形成新的大顶堆,再与当前末尾进行交换;
d.反复执行调整、交换过程。
堆排序除了初始建堆的过程时间复杂度为Θ(n),后面重建堆的过程根据完全二叉树的性质,时间复杂度为Θ(log2(n-1)),这个n为未排序序列长度,随着排序过程递减;而整个交换过程进行n-1次,所以时间复杂度近似为Θ(nlogn)。
对于输入的整数序列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依次排列。计数排序只能对整数进行排序,且需要额外空间,对于最大值较大的序列不适用。
对于输入序列n,有最大值max和最小值min。
a.排序前先设置空桶的数量,如5,则每个桶存放的值的范围为(max-min+1)/5=a;
b.把每个元素放到对应的桶当中,对应计算为(n[i]-min)/a,如计算得3,则放入第3个桶;
c.对每个不为空的桶进行排序,任意其他排序算法均可;
d.将不为空的桶直接拼接。
设置编号为0~9的10个桶,每次排序的时候将所排位相对应的数放入桶中,入排十位时,将110和318均放入编号为1的桶,完成每位的排序后将桶展开。
a.找到输入序列中的最大数max并获取max的位数;
b.按照序列的低位(个位)进行排序,只排个位;
c.再按照序列个高一位(十位)进行排序,只排十位;
d.依次进行,直到完成最高位的排序。
算法8、9、10都涉及了桶的概念,他们有使用了外部空间,都是非比较排序,排序速度快,但是对内存和数据有一定要求。