归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。
归并排序算法有两个基本的操作,一个是分,也就是把原数组划分成两个子数组的过程。另一个是治,它将两个有序数组合并成一个更大的有序数组。
将待排序的线性表不断地切分成若干个子表,直到每个子表只包含一个元素,这时,可以认为只包含一个元素的子表是有序表。
将子表两两合并,每合并一次,就会产生一个新的且更长的有序表,重复这一步骤,直到最后只剩下一个子表,这个子表就是排好序的线性表。
public void mergeSort(int[] arr, int left, int right){
if(left>=right) return;
int mid = left+(right-left)/2;
mergeSort(arr, left, mid);
mergeSort(arr, mid+1, right);
merge(arr, left, mid, right);
}
public void merge(int[] arr, int start, int mid, int end){
int left = start, right = mid+1, index = 0;
int[] temp = new int[end-start+1];
while(left<=mid && right<=end){
if(arr[right]>arr[left]) temp[index++] = arr[left++];
else temp[index++] = arr[right++];
}
while(left<=mid) temp[index++] = arr[left++];
while(right<=end) temp[index++] = arr[right++];
for(int i=start; i<=end; i++) arr[i] = temp[i-start];
}