Java程序员必须掌握的8大【排序算法】

排序大的分类可以分为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

猜你喜欢

转载自blog.csdn.net/qq_24047659/article/details/86613345