数据结构之归并排序,采用‘分治’法,
//合并
public static void Merge(int[] arr, int left, int mid, int right, int[] temp) {
int i = left;//左边初始指针
int j = mid + 1;//右边的初始指针
int t = 0;//临时数组temp的初始值
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;
int temleft = left;
while (temleft <= right) {
arr[temleft++] = temp[t++];
}
}
-
拆分并合并
-
分+合的方法(采用递归的方法)
public static void PartMerge(int[] arr, int left, int right, int[] temp) { //当数组的长度不为1时 if (left < right) { int mid = (left + right) / 2; //递归的进行分割 PartMerge(arr, left, mid, temp); PartMerge(arr, mid + 1, right, temp); //分割之后再合并 Merge(arr, left, mid, right, temp); }
}