归并排序通俗来说就是分和治两个过程。
首先将一组无序的数组平均分为两个数组,然后再分,一直分到只剩下两个数为止。
然后到了治阶段,拿4 5 7 8与1 2 3 6作举例,即先比较4和1的大小,发现4大于1,那么将1放入到最后的数组中。再将4和2比较,4仍大于2,将2放入数组中。将4和3比较,将3放入数组中。将4与6比较,发现4小于6,那么将4放入数组中,直到所有的数都放入到数组中即可。
public class guiBing {
public static void main(String[] args) {
int[] arr = {9, 4, 5, 8, 1, 3, 7};
sort(arr);
System.out.println(Arrays.toString(arr));
}
public static void sort(int[] arr) {
int[] temp = new int[arr.length];//注意长度
sort(arr,0,arr.length-1,temp);
}
public static void sort(int[] arr, int left, int right, int[] temp) {
if (left < right) {
int mid = (left + right) / 2;
sort(arr, mid + 1, right, temp);
sort(arr, left, mid, temp);
megre(arr, left, mid, right, temp);
}
}
public static void megre(int[] arr, int left, int mid, int right, int[] temp) {
int i = left;
int j = mid + 1;
int t = 0;
while (i <= mid && j <= right) {
if (arr[i] <= arr[j]) {
temp[t++] = arr[i++];
} else {
temp[t++] = arr[j++];
}
}
while (i<=mid){
temp[t++] = arr[i++];
}
while (j<=right){
temp[t++] = arr[j++];
}
t=0;
while (left<= right){
arr[left++]=temp[t++];
}
}
}
时间复杂度:O(nlogn)
空间复杂度:O(n)