排序算法归并排序
Posted yadiel-cc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法归并排序相关的知识,希望对你有一定的参考价值。
归并排序
2019-11-10 11:41:59 by冲冲
1、概念
归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略。
分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之。
2、基本思想
归并排序采用递归实现(也可以采用迭代的方式实现)。分阶段就是递归拆分子序列的过程,递归深度为log2n。
合并相邻有序子序列
治阶段就是将两个已经有序的子序列合并成一个有序序列,比如最后一次合并,要将[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,6,7,8],来看下实现步骤。
3、完整代码
1 public class MergeSort { 2 public static void main(String []args){ 3 int i; 4 int []a = {9,8,7,6,5,4,3,2,1}; 5 6 System.out.printf("before sort:"); 7 for (i=0; i<a.length; i++){ 8 System.out.printf("%d ", a[i]); 9 } 10 System.out.printf(" "); 11 12 mergeSort(a); 13 14 System.out.printf("after sort:"); 15 for (i=0; i<a.length; i++){ 16 System.out.printf("%d ", a[i]); 17 } 18 System.out.printf(" "); 19 } 20 21 public static void mergeSort(int []arr){ 22 int []temp = new int[arr.length]; 23 //在排序前,先建好一个长度等于原数组长度的临时数组, 24 //避免递归中频繁开辟空间 25 mergeSort(arr,0,arr.length-1,temp); 26 } 27 28 private static void mergeSort(int[] arr,int left,int right,int []temp){ 29 if(left<right){ 30 int mid = (left+right)/2; 31 mergeSort(arr,left,mid,temp); 32 //左边归并排序,使得左子序列有序 33 mergeSort(arr,mid+1,right,temp); 34 //右边归并排序,使得右子序列有序 35 merge(arr,left,mid,right,temp); 36 //将两个有序子数组合并操作 37 } 38 } 39 40 private static void merge(int[] arr,int left,int mid,int right,int[] temp){ 41 int i = left;//左序列指针 42 int j = mid+1;//右序列指针 43 int t = 0;//临时数组指针 44 while (i<=mid && j<=right){ 45 if(arr[i]<=arr[j]){ 46 temp[t++] = arr[i++]; 47 }else { 48 temp[t++] = arr[j++]; 49 } 50 } 51 while(i<=mid){//将左边剩余元素填充进temp中 52 temp[t++] = arr[i++]; 53 } 54 while(j<=right){//将右序列剩余元素填充进temp中 55 temp[t++] = arr[j++]; 56 } 57 t = 0; 58 //将temp中的元素全部拷贝到原数组中 59 while(left <= right){ 60 arr[left++] = temp[t++]; 61 } 62 } 63 }
before sort: 9 8 7 6 5 4 3 2 1
after sort: 1 2 3 4 5 6 7 8 9
以上是关于排序算法归并排序的主要内容,如果未能解决你的问题,请参考以下文章