归并排序
将一串元素递归分成左右数组,直到分到最少为止,并将左右两边的元素排好序,最后组合拼接
- 排序过程是用分好后左边数组的第一个数 与 右边 数组的第一个数比较,小的那个数放在临时数组里,这样临时数组就会从小到大排好,然后将临时数组赋给原数组
package Sort;
import java.util.Arrays;
public class MSort {
public static void main(String[] args) {
int[] array = new int[]{6, 9, 4, 7, 1, 2, 0, 5, 3, 8};
//定义临时数组
int[] temp = new int[array.length];
sort(0, array.length - 1, array, temp);
System.out.println(Arrays.toString(array));
}
public static void sort(int left, int right, int[] array, int[] temp) {
//left是左边的指针,right是右边的指针
//前提条件,left<right
if (left < right) {
//求出中间值
int mid = (left + right) / 2;
//向左分解,左边分组的右边指针更新为mid
sort(left, mid, array, temp);
//向右分解,右边分治的左边指针更新为mid
sort(mid + 1, right, array, temp);
//分解完合并,合并的过程中就排好序了
sum(left, right, mid, array, temp);
}
}
public static void sum(int left, int right, int mid, int[] array, int[] temp) {
int i = left;
int j = mid + 1;
int t = 0;//指向临时工数组下标
//开始比较左右两边的数组
while (i <= mid && j <= right) {
if (array[i] <= array[j]) {
temp[t] = array[i];
t++;
i++;
} else {
temp[t] = array[j];
t++;
j++;
}
}
/**
把剩余元素放在临时数组中
*/
while (i <= mid) {
temp[t] = array[i];
t++;
i++;
}
while (j <= right) {
temp[t] = array[j];
t++;
j++;
}
/**
* 把临时数组的元素放回原始数组中
*/
int k = 0;
int tempIndex = left;
while (tempIndex <= right) {
array[tempIndex] = temp[k];
k++;
tempIndex++;
}
}
}