package com.sourcecode;
import java.util.Arrays;
//归并排序
public class ArraySort {
public static void main(String[] args) {
int[] arr = {2,7,6,4,5,8,3,11,1,19,1,17,16};
int[] tmp = new int[arr.length];
sortIfNecessary(arr,0,arr.length -1,tmp);
//排序后
System.out.println(Arrays.toString(arr));
}
//递归切分数组元素
public static void sortIfNecessary(int[] arr, int left, int right, int[] tmp){
//当不能再往下切分时返回
if (left >= right){
return;
}
int mid = (left + right)/2;
sortIfNecessary(arr, left, mid, tmp);
sortIfNecessary(arr, mid + 1, right, tmp);
mergeSort(arr, left, mid, right, tmp);
}
//归并排序
public static void mergeSort(int[] arr, int left, int mid, int right, int[] tmp){
//归并
int t = 0;
//赋值指针
int a = left;
int b = mid + 1;
//同时移动左边指针和右边指针,比较大小,直到有一边指针越界,就可以将另一边没有越界已经排序好的数据追加到后面,不会出现同时未越界的情况
while (a <= mid && b <= right){
if (arr[a] < arr[b]){
tmp[t++] = arr[a++];
}else {
tmp[t++] = arr[b++];
}
}
//判断左边指针有没有越界,没有则追加剩余元素
while (a <= mid){
tmp[t++] = arr[a++];
}
//判断右边指针有没有越界,没有则追加剩余元素
while (b <= right){
tmp[t++] = arr[b++];
}
//将临时数组的值替换arr
t = 0;
while (left <= right){
arr[left++] = tmp[t++];
}
}
}
归并排序java解法
最新推荐文章于 2022-10-18 00:25:47 发布