public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] arr = {12,4,21,14,2};
mergeSort(arr,0,arr.length - 1);
System.out.println(Arrays.toString(arr));
}
public static void mergeSort(int[] arr,int left,int right) {
if (left == right) {
return;
}
int mid = (left + right) / 2;
//递归调用 分割成最小组
mergeSort(arr,left,mid);
mergeSort(arr,mid + 1,right);
//数组两两合并
merge(arr,left,mid,right);
}
static void merge(int[] arr,int left,int mid,int right) {
//需要申请一个数组来存两个合并过的有序数组,最后再赋值回arr数组
int[] temp = new int[arr.length];
int l1 = left;//记录一组数组的起始index
int l2 = mid + 1;//记录第二组需要合并的数组的起始index
int k = left;//temp数组的起始index
while (l1 <= mid && l2 <= right) {
//比较大小
if (arr[l1] <= arr[l2]) {
temp[k] = arr[l1];
l1++;
}else{
temp[k] = arr[l2];
l2++;
}
k++;
}
//把剩余的元素写入
while (l1 <= mid) {
temp[k] = arr[l1];
l1++;
k++;
}
while (l2 <= right) {
temp[k] = arr[l2];
l2++;
k++;
}
//把temp数组的元素写回arr
for (int i = left; i <= right; i++) {
arr[i] = temp[i];
}
}
}
学会归并排序(java),这一篇就够了
于 2023-03-27 12:50:46 首次发布