归并排序
归并排序的算法是分治法的一个范例
Like QuickSort, Merge Sort is a Divide and Conquer algorithm.它被分成两半,调用自己来分两半,最后归并两半。merge()功能用于合并两半。The merge (arr,l,m,r)是关键的处理arr[l...m]和arr[m+1,r]被存储并合并两个子数组成为一个。
接下来是代码思想:
MergeSort(arr[],l,r) If r>l: 1.Find the middle point to divide the array into two halves: middle m = (l+r)/2 2.Call mergeSort for first half: Call mergeSort(arr,l,m) 3.Call mergeSort for second half: Call mergeSort(arr,m+1,r) 4.Merge the two halves sorted in step 2 and 3: Call merge(arr,l,m,r)
下面的流程图展示了完成一个merge排序的处理流程{38,27,43,3,9,82,10}。我们可以发现这个数组被递归分割成两部分知道大小变成1,一旦size到达1,merge处理流程合并生效,开始归并数组直到整个数组完成。
import java.util.Arrays; public class mergSort { public static void main(String[] args) { int[] array = {5,2,3,7,9,10}; //sort(array,0,array.length-1); sort(array,0,array.length-1); System.out.println(Arrays.toString(array)); } public static void sort(int[] array,int l,int r) { if(l<r) { int mid = (l+r)/2; sort(array,l,mid); sort(array,mid+1,r); merge(array,l,mid,r); } } public static void merge(int[] array, int l, int m, int r) { int n1 = m-l+1; int n2 = r-m; //create two temp arrays int L[] = new int[n1]; int R[] = new int[n2]; for(int i=0;i<n1;i++) { L[i] = array[l+i]; } for(int j=0;j<n2;j++) { R[j] = array[m+1+j]; } //merge two array int i=0, j =0; int index = l; while((i<n1)&&(j<n2)) { if(L[i]<=R[j]) { array[index] = L[i]; i++; } else { array[index] = R[j]; j++; } index++; } while(i<n1) { array[index] = L[i]; index++; i++; } while(j<n2) { array[index] = R[j]; index++; j++; } } }
Time Complexity:
T(n) = 2T(n/2) + O(n)
n*log2N
相关推荐
nongfusanquan0 2020-08-18
Broadview 2020-07-19
数据与算法之美 2020-07-05
Masimaro 2020-06-21
wonner 2020-06-17
Oudasheng 2020-06-04
从零开始 2020-06-05
清溪算法君老号 2020-06-01
风吹夏天 2020-05-26
yangjingdong00 2020-05-11
Tips 2020-04-30
troysps 2020-04-26
ustbfym 2020-04-25
清溪算法君老号 2020-04-24
dushine00 2020-04-19
数据与算法之美 2020-04-18
wulaxiaohei 2020-04-17
nurvnurv 2020-04-16