排序算法之归并排序

来源:互联网 发布:python argv列表参数 编辑:程序博客网 时间:2024/06/15 06:20

今天分享的算法是归并排序,排序有很多种算法

=====相关链接====

有对快速排序感兴趣的同学请点击锦绣谷传送门

有对堆排序感兴趣的同学请点击银月城传送门

进入我们今天的正题,首先引入概念

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。

看个例子,如一个无序数组3,5,7,2,6,1,3,8,4

归并排序的策略是将有序的子序列合并,也就是说我们要把它拆成若干个子序列,也就是拆成

3,5|7,2|6,1|3,8|4  之后我们对有序的子序列进行合并,先对3,5|7,2进行合并

35 72   合并方法是判断两首尾两个指针指向数字的大小,例如上面的事例3<2所以在新的数组我们放入第一位2,然后旧数组2对应的指针左移,变为

35 72   之后继续比较两个指针所指数字的大小,肯定是取出3来,然后将3放入新数组的第二位,然后将3的指针右移,变为

35 72   此时在进行比较,取出5,将5放入新的数组的第三位,然后将5对应的指针右移,此时指针超出左边数组大小了,所以我们将右边数组剩余的数字全部补全在新数组最末尾,因此新数组是2,3,5,7

同样操作我们对6,1,3,8也进行一下归并,得到新的数组是1,3,6,8

然后在堆2,3,5,7和1,3,6,8进行排列,得到新的数组1,2,3,3,5,6,7,8

最后对1,2,3,3,5,6,7,8和4进行排列,得到最终数组1,2,3,3,4,5,6,7,8

这就是一个完整的归并排序,下面我们看代码

public class MergeSort {//合并方法private static void mergeArray(int[] array,int l,int m,int r){//nlogn//start1 = l end1 = m//start2 = m+1 end2=r//指定长度结果int[] temp = new int[r-l+1];//start1int i = l;//start2int j = m+1;int k = 0;//temp下标while(i <= m && j <= r){temp[k++] = array[i] < array[j] ? array[i++] :array[j++];}//右侧数组用完,左侧数组全部拿下来while(i <= m){temp[k++] = array[i++];}//左侧数组用完,右侧数组全部拿下来while(j <= r){temp[k++] = array[j++];}//新数组赋值给老数组for (int x = 0, y = l; x < temp.length; x++ , y++) {array[y] = temp[x];}}private static void mergeSort(int[] array,int l,int r){if(l == r){return;}int m = (l+r)/2;mergeSort(array, l, m);//左mergeSort(array, m+1, r);//右mergeArray(array, l, m, r);//合并}public static void main(String[] args) {int[] array = new int[]{3,5,7,2,6,1,3,8,4};mergeSort(array, 0, array.length-1);for (int i : array) {System.out.print(i+",");}}}


我们先调用mergeSort方法,里面递归调用mergeSort,目的在于把数组分成多个有序的小数组,然后调用mergeArray进行归并操作,得到最终数组

代码上面有详细的注释,可以根据上面的步骤对照看一下,如果有问题请留言,第一时间解答



原创粉丝点击