简单插入排序
插入排序的基本思想是将整个排序序列划分成“有序区间”和“无序区间”,然后逐个将无序区间中的元素插入到前面有序区间了,逐步将这个区间变有序。其算法复杂度为O(n^2)
其算法描述如下:
其java实现如下
希尔排序
希尔排序是插入排序的一个变种,它使用缩减的增量来进行插入排序,它的时间复杂度达到了O(n^3/2),也就是亚平方级别。
其算法描述如下:
其java实现如下
堆排序
如果我们想要从小到大排序,那么我们需要使用大根堆进行堆排序的过程,堆排序有两个主要过程:初始建堆过程和移除堆顶元素进行调整的过程,两个过程都用到了“下滤”的调整算法,整个堆排序的算法复杂度可以是O(N logN),其实现思路如下。
首先是下滤的过程
初始建堆的过程很简单,就是从最后一个非叶子节点开始进行下滤,直至根节点,其java代码如下
写完了下滤过程,那么我们的堆排序过程就可以利用下滤调整的过程来进行描述
其java代码如下
快速排序
正如起名,快速排序是使用最为广泛的一种排序算法,它采用了分治的策略,所以很容易用递归的方式来描述整个过程,快速排序的统计效率达到了O(N logN),但是实际上快速排序的最坏情况可以达到O(N^2),算法的实际效率和选取的轴值有密切的关系。
简单的讲来,我们首先从待排序序列中选取一个轴值,根据这个轴值将整个序列划分成两部分,左边的部分所有的值小于轴值,而右边的部分所有的值大于轴值,然后我们再采用同样的方法对左右两部分进行排序,直到每部分只有一个值为止。详细的算法描述如下
其代码如下
归并排序
归并排序也是一个O(N logN)的排序算法,但是归并排序需要额外O(N)的空间,归并排序的基本操作是将两个排序好的数组进行合并,而合并的过程不可避免的要使用临时数组。
合并的简述过程是这样的,对于A,B两个排序好的数组,合并到数组C。A,B各维护一个指针pa,pb指向当前扫描到的位置,如果A[pa]<B[pb],就将A[pa]复制到C[pc],并且pa和pc向前移动一个,否则就将B[pb]复制到C[pc],并且pb和pc向前移动一个。如果A,B中有剩余的,就将剩余的全部赋值给C。
写好了合并的算法,那么归并排序的算法就可以在这个基础上得以搭建,其核心思想是将数组分成两部分,然后采用递归的方式排序连个部分,最后进行合并操作,详细如下
其算法实现如下
全部源码
全部源码请点击这里,你同样可以在我的博客(点击这里)上看到这篇文章。