package com.example.ljia.Structure.Arr;
/**
* @ Author :SamLai
* @ Date :Created in 2019-04-28
* @ Description:归并排序
* 时间复杂度: O(nlogn)
*/
public class MergeArr {
/**
* 归并排序内容
* @param start
* @param end
* @param arr
* @return
*/
public static int[] mergeSort(int start, int end, int[] arr) {
if (start >= end) {
return arr;
}
int mid = (end + start) / 2;
mergeSort(start, mid, arr);
mergeSort((mid + 1), end, arr);
// System.out.println(" mid " + mid + " next mid " + (mid + 1));
if (arr[mid] > arr[mid + 1]) {
arr = merge(start, end, mid, arr);
}
return arr;
}
/**
* 开辟N的空间来进行比对2个已经排好的数组
* @param start
* @param end
* @param arr
* @return
*/
private static int[] merge(int start, int end,int mid, int[] arr) {
//还得将原来的值进行copy一份到新的数组上
int[] result = new int[arr.length];
for (int p = start; p <= end; p++) {
result[p] = arr[p];
}
int leftIndex = start, rightIndex = mid + 1;
for (int k = start; k <= end; k++) {
//左边已经排完了
if (leftIndex > mid) {
arr[k] = result[rightIndex];
rightIndex++;
}
//右边已经排完了
else if (rightIndex > end) {
arr[k] = result[leftIndex];
rightIndex++;
}
//左边大于右边
else if (result[leftIndex] > result[rightIndex]) {
arr[k] = result[rightIndex];
rightIndex++;
}else {
arr[k] = result[leftIndex];
leftIndex++;
}
}
// System.out.println();
// Aprintln(arr);
// System.out.println();
return arr;
}
private static void Aprintln(int[] karr) {
for (int k : karr) {
System.out.print(k + " ");
}
}
public static void main(String[] args) {
// int[] karr = new int[]{12};
int[] karr = new int[]{12, 2, 23, 9, 18, 34, 67, 90, 110, 8};
karr = mergeSort(karr);
Aprintln(karr);
}
public static int[] mergeSort(int[] karr) {
int start = 0, end = karr.length;
// 边界的问题很重要 : [start,end]
karr = mergeSort(start, end-1, karr);
return karr;
}
}