归并排序算法代码实现
上代码
package com.liu.pro; import java.util.Arrays; public class mergeSort { public static void main(String[] args) { // 测试数组 int[] arr = {9, 8, 5, 6, 2, 7, 1, 3, 4}; int[] temp = new int[arr.length]; sort(arr, 0, arr.length - 1, temp); System.out.println("归并排序算法"); System.out.println(Arrays.toString(arr)); } public static void sort(int[] arr, int left, int right, int[] temp) { if (left < right) { // 找到中间值mid索引 int mid = (left + right) / 2; // 调用方法向左进行递归分解 sort(arr, left, mid, temp); // 调用方法向右进行递归分解,mid+1为了让递归的元素不重复 sort(arr, mid + 1, right, temp); // 递归合并 mergeSort(arr, left, mid, right, temp); } } /** * 归并排序中的"合"实现 * * @param arr 即将排序的数组 * @param left 左边界索引 * @param mid 中间值 * @param right 右边界索引 * @param temp 临时的数组 */ public static void mergeSort(int[] arr, int left, int mid, int right, int[] temp) { // 定义一个左索引变量 int i = left; // 定义一个右索引变量 int j = mid + 1; // 定义临时temp数组的下标索引t,放入temp数组进行中转,递归 int t = 0; // 左右两边只要有一个将数全部放入temp中,则退出循环,否则一直循环查找 while (i <= mid && j <= right) { // 如果左边的比右边的数小,就将左边的数放入temp // 反之(相等或者大于)则将右边的数放入temp if (arr[i] < arr[j]) { temp[t] = arr[i]; // 索引后移 i += 1; t += 1; } else { temp[t] = arr[j]; // 同上 j += 1; t += 1; } } // 上述循环结束有二种情况1.左侧数组全部放入temp 2.右侧数组全部放入temp // 左侧数组没有全部放入,则将其放入temp while (i <= mid) { temp[t] = arr[i]; i += 1; t += 1; } // 右侧数组没有完全放入,则将右侧数组完全放入temp while (j <= right) { temp[t] = arr[j]; j += 1; t += 1; } // 将排好顺序的temp放入arr[]数组将数组中的数值进行更新,再进行后续递归调用 // 重置temp下标 t = 0; // 重新定义一个指针 int tempLeft = left; // 只要循环中指针tempLeft小于等于right指针,则放入临时数组 // 如果数组已经完全放入 while (tempLeft <= right) { arr[tempLeft] = temp[t]; tempLeft += 1; t += 1; } } }
测试结果: