归并排序1
/**
* @Description 归并排序 前n+1有序,后n有序,对这种数组排序
* @Author calvin
* @Date 2019/9/1 15:14
**/
public class MergeSort {
public static void main(String[] args){
int[] arr = {1,4,7,8,11,3,6,9,10};
merge(arr);
}
private static void merge(int[] arr) {
int mid = arr.length/2;
int[] temp = new int[arr.length];
int i = 0;
int j = mid +1;
int k =0;
while(i<=mid&&j<arr.length){
temp[k++] = arr[i]<=arr[j]?arr[i++]:arr[j++];
}
while (i<=mid) temp[k++] = arr[i++];
while (j<arr.length) temp[k++] = arr[j++];
print(temp);
}
static void print(int[] arr) {
for (int anArr : arr) {
System.out.print(anArr + " ");
}
}
}
真正的并归排序
/**
* @Description 归并排序
* @Author calvin
* @Date 2019/9/1 15:14
**/
public class MergeSort {
public static void main(String[] args) {
int[] arr = {1, 4, 7, 8, 11, 13, 15, 3, 6, 9, 10, 12, 14};
sort(arr, 0, arr.length - 1);
print(arr);
}
static void sort(int[] arr, int left, int right) {
if (left == right) return;
//分成两半
int mid = left + (right - left) / 2;
//左边排序
sort(arr, left, mid);
sort(arr, mid + 1, right);
merge(arr, left, mid + 1, right);
}
private static void merge(int[] arr, int leftPoint, int rightPoint, int rightBound) {
int mid = rightPoint - 1;
int[] temp = new int[rightBound - leftPoint + 1];
int i = leftPoint;
int j = rightPoint;
int k = 0;
while (i <= mid && j <= rightBound) {
temp[k++] = arr[i] <= arr[j] ? arr[i++] : arr[j++];
}
while (i <= mid) temp[k++] = arr[i++];
while (j <= rightBound) temp[k++] = arr[j++];
for (int m = 0; m < temp.length; m++)
arr[leftPoint + m] = temp[m];
}
static void print(int[] arr) {
for (int anArr : arr) {
System.out.print(anArr + " ");
}
}
}