04-归并排序
2021-09-04 本文已影响0人
唔哒喂
将一组数据先进行分组,取index中间值。直到每组只剩下一个数字。
之后按顺序(从小到大)合并。
采用递归进行分。
完整代码见文末
分组函数
public static void MergeSort(int[] arr, int L, int R)
排序函数
public static void merge(int[] arr, int L, int R, int mid)
分组
例子:
Arr={10, 3, 8, 4}
这组数据使用归并排序。
Value: 10, 3, 8,4
Index: 0, 1, 2,3
开始分组
L = 0; R=3;
将四个数字分组
获取中间值 mid = (L + R) / 2 = 1
那么已经分为了两组
0 - mid,
mid + 1 - R
即每次分组需确认的是mid值
int mid = (L + R) / 2;
左边:
Value:10, 3
Index: 0, 1
右边:
Value:8,4
Index:2,3
左边再分:
L = 0, R = 1; mid = 0
左:
Value:10
Index: 0
右:
Value:3
Index:1
右侧同理。
将一组数分到每组一个数据需要重复取mid值
即
int mid = (L + R) / 2;
MergeSort(arr, L, mid);
MergeSort(arr, mid + 1, R);
每次分组都先要保证L和R不再
已经分到一个数据一组,开始合并。
最先进行合并的是 10 和 3
合并
合并的方法及参数为
public static void merge(int[] arr, int L, int R, int mid)
创建一个temp[]来根据大小存放合并的两组数。
int l = L;//分组1的索引
int m = mid + 1;//分组2的索引
int[] temp = new int[arr.length];
int tempInd = l;
遍历比较两组数,根据顺序存放进temp[]
while (l <= mid && m <= R){
if (arr[l] < arr[m])
temp[tempInd++] = arr[l++];
else
temp[tempInd++] = arr[m++];
}
将未存放进temp[]的数组1或数组2中的数据,进行处理。
while (l <= mid)
temp[tempInd++] = arr[l++];
while(m <= R)
temp[tempInd++] = arr[m++];
最后根据temp[]中的数据修改array[],索引即为L和R
for (int i = L; i <= R; i++)
arr[i] = temp[i];
完整代码
public static void merge(int[] arr, int L, int R, int mid){
// 从小到大
int l = L;
int m = mid + 1;
int[] temp = new int[arr.length];
int tempInd = l;
while (l <= mid && m <= R){
if (arr[l] < arr[m])
temp[tempInd++] = arr[l++];
else
temp[tempInd++] = arr[m++];
}
while (l <= mid)
temp[tempInd++] = arr[l++];
while(m <= R)
temp[tempInd++] = arr[m++];
for (int i = L; i <= R; i++)
arr[i] = temp[i];
System.out.println(Arrays.toString(temp));
}
public static void MergeSort(int[] arr, int L, int R){
if (L == R)
return;
int mid = (L + R) / 2;
MergeSort(arr, L, mid);
MergeSort(arr, mid + 1, R);
merge(arr, L, R, mid);
}