public class Merge {
static int[] tmp; //临时数组 归并的时候需要用到
static void sort(int[] arr){
sort(arr, 0, arr.length - 1);
}
/**
* 调用递归先对数组进行分组
*/
static void sort(int[] arr, int low, int hi) {
if(low >= hi){
return; // 当数组不能进行继续分组的时候 跳出递归
}
int mid = low + (hi - low)/2;
sort(arr, low, mid);
sort(arr, mid + 1, hi);
merge(arr, low, hi, mid);
}
static void merge(int[] arr, int low, int hi, int mid){
tmp = new int[arr.length];
int i = low;
int p1 = low;
int p2 = mid + 1;
while (p1 <= mid && p2 <= hi){
// 从两个数组中 拿出各自最小的值进行比较 较小的放进临时数组
// 当某个数组中的数字全部放进临时数组 结束比较
if(arr[p1] < arr[p2]){
tmp[i++] = arr[p1++];
}else{
tmp[i++] = arr[p2++];
}
}
// 仍然有剩余数字的数组 里面的数据直接放进临时数组
while (p1 <= mid){
tmp[i++] = arr[p1++];
}
while (p2 <= hi){
tmp[i++] = arr[p2++];
}
// 此时临时数组的值已经按照顺序排列
// 将临时数组的值再放回原数组
for (int j = low; j <= hi; j++) {
arr[j] = tmp[j];
}
}
}
算法五之归并排序
最新推荐文章于 2024-10-20 17:09:42 发布