排序大的分类可以分为2种:【内排序】和【外排序】。
- 内排序:在排序过程中,全部记录存放在【内存】,则称为内排序。
- 外排序:在排序过程中,需要使用【外存】,则称为外排序。
下面讲解的排序都是属于内排序。
8大排序算法详解
一、直接插入排序
在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这 n个数也是排好顺序的。如此反复循环,直到全部排好顺序。
直接插入排序基本思想是每一步将一个待排序的记录,插入到前面已经排好序的有序序列中去,直到插完所有元素为止。
直接插入排序
直接插入排序在在本身数量比较少的时候情况下效率很高,如果待排数的数量很多,其效率不是很理想。
回想一下直接插入排序过程,排序过程中,我们可以设置一条线,左边是排好序的,右边则是一个一个等待排序,
如果最小的那个值在最右边,那么排这个最小值的时候,需要将所有元素向右边移动一位。
是否能够减少这样的移位呢?
我们不希望它是一步一步的移动,而是大步大步的移动。
希尔排序就被发明出来了,它也是当时打破效率O(n2)的算法之一。
二、希尔排序(最小增量排序)
希尔排序算法通过设置一个【间隔】, 对同样间隔的数的集合进行插入排序,此数集合中的元素移位的长度是以间隔的长度为准,这样就实现了大步位移。
但是最后需要对元素集合进行一次直接插入排序,所以最后的间隔一定是1。
下面举一个例子:
第一趟希尔排序,间隔为4
第二趟希尔排序,间隔为2
第三趟 间隔为1,即 直接插入排序法:
。。。
算法先将要排序的一组数按某个增量 d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差 d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。当增量减到 1 时,进行直接插入排序后,排序完成。
希尔排序
三、简单选择排序
在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。
简单选择排序
四、堆排序
五、冒泡排序
在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。
冒泡排序
六、快速排序
选择一个【基准元素】,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。
快速排序
七、归并排序
归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。
归并排序
八、基数排序
https://mp.weixin.qq.com/s/J0NrAsMbdyJx2oBywRS8Tw