归并排序法
归并排序法
刚学完韩老师的JAVA数据结构与算法课程,先将代码保存在这里
归并排序算法的时间复杂度为nlogn。
1 package Demo01; 2 3 import java.util.Arrays; 4 5 public class MergeSort { 6 public static void main(String[] args) { 7 int[] arr = {0, 4, 5, 7, 1, 3, 6, 2,23,-99}; 8 int[] tmp = new int[arr.length]; 9 mergeSort(arr, 0, arr.length - 1, tmp); 10 11 System.out.println("归并排序后: " + Arrays.toString(arr)); 12 } 13 14 /** 15 * 合并的过程 16 * 17 * @param arr 需要排序地原始数组 18 * @param left 左边有序序列地初始索引 19 * @param mid 中间索引 20 * @param right 右边索引 21 * @param tmp 作中转的数组 22 */ 23 public static void merge(int[] arr, int left, int mid, int right, int[] tmp) { 24 int i = left; //初始化i,左边有序序列的初始索引 25 int j = mid + 1; //初始化j,右边有序序列的初始索引 26 int t = 0; //指向tmp数组的当前索引 27 28 /** 29 * (一)先把左右两边(有序)的数据按照规则填充到tmp数组 30 * 知道左右两边的有序序列,有一边处理完成为止 31 */ 32 while (i <= mid && j <= right) { 33 /** 34 * 如果左边有序序列的当前元素,小于等于右边有序序列的元素 35 * 那么将左边的当前元素拷贝到右边 36 * 然后tmp数组当前所以t要往后移 37 * 反之,就把右边的数据填充到tmp数组中 38 */ 39 if (arr[i] <= arr[j]) { 40 tmp[t] = arr[i]; 41 i++; 42 t++; 43 } else { 44 tmp[t] = arr[j]; 45 j++; 46 t++; 47 } 48 } 49 50 /** 51 * (二)把有剩余数据的一边的数据依次全部填充到填充到tmp 52 * 1、当左边没做完的时候,把左边剩余元素拷到左边 53 * 2、当右边没做完的时候,把右边的剩余元素考到右边 54 */ 55 while (i <= mid) { 56 tmp[t] = arr[i]; 57 t++; 58 i++; 59 } 60 while (j <= right) { 61 tmp[t] = arr[j]; 62 j++; 63 t++; 64 } 65 66 /** 67 * (三)将tmp数组拷贝到arr 68 * 注意:并不是每次都是拷所有的 69 */ 70 t = 0; 71 int tmpLeft = left; 72 while (tmpLeft <= right) { 73 arr[tmpLeft] = tmp[t]; 74 t++; 75 tmpLeft++; 76 77 } 78 } 79 80 public static void mergeSort(int[] arr, int left, int right, int[] tmp) { 81 if (left < right) { 82 int mid = (left + right) / 2; 83 mergeSort(arr, left, mid, tmp); //向左递归分解 84 mergeSort(arr, mid + 1, right, tmp); //向右递归分解 85 merge(arr,left,mid,right,tmp); //开始合并 86 } 87 } 88 }