[Java] java归并排序算法 →→→→→进入此内容的聊天室

来自 , 2019-08-25, 写在 Java, 查看 105 次.
URL http://www.code666.cn/view/2050e03c
  1. /**
  2.  * 归并排序:里面是一个递归程序,深刻理解之。
  3.  */
  4. public class MergeSort {
  5.  
  6.         /**
  7.          * 递归划分数组
  8.          *
  9.          * @param arr
  10.          * @param from
  11.          * @param end
  12.          * @param c
  13.          *            void
  14.          */
  15.         public void partition(Integer[] arr, int from, int end) {
  16.                 // 划分到数组只有一个元素时才不进行再划分
  17.                 if (from < end) {
  18.                         // 从中间划分成两个数组
  19.                         int mid = (from + end) / 2;
  20.                         partition(arr, from, mid);
  21.                         partition(arr, mid + 1, end);
  22.                         // 合并划分后的两个数组
  23.                         merge(arr, from, end, mid);
  24.                 }
  25.         }
  26.  
  27.         /**
  28.          * 数组合并,合并过程中对两部分数组进行排序 前后两部分数组里是有序的
  29.          *
  30.          * @param arr
  31.          * @param from
  32.          * @param end
  33.          * @param mid
  34.          * @param c
  35.          *            void
  36.          */
  37.         public void merge(Integer[] arr, int from, int end, int mid) {
  38.                 Integer[] tmpArr = new Integer[arr.length];
  39.                 int tmpArrIndex = 0;// 指向临时数组
  40.                 int part1ArrIndex = from;// 指向第一部分数组
  41.                 int part2ArrIndex = mid + 1;// 指向第二部分数组
  42.  
  43.                 // 由于两部分数组里是有序的,所以每部分可以从第一个元素依次取到最后一个元素,再对两部分
  44.                 // 取出的元素进行比较。只要某部分数组元素取完后,退出循环
  45.                 while ((part1ArrIndex <= mid) && (part2ArrIndex <= end)) {
  46.                         // 从两部分数组里各取一个进行比较,取最小一个并放入临时数组中
  47.                         if (arr[part1ArrIndex] - arr[part2ArrIndex] < 0) {
  48.                                 // 如果第一部分数组元素小,则将第一部分数组元素放入临时数组中,并且临时数组指针
  49.                                 // tmpArrIndex下移一个以做好下次存储位置准备,前部分数组指针part1ArrIndex
  50.                                 // 也要下移一个以便下次取出下一个元素与后部分数组元素比较
  51.                                 tmpArr[tmpArrIndex++] = arr[part1ArrIndex++];
  52.                         } else {
  53.                                 // 如果第二部分数组元素小,则将第二部分数组元素放入临时数组中
  54.                                 tmpArr[tmpArrIndex++] = arr[part2ArrIndex++];
  55.                         }
  56.                 }
  57.                 // 由于退出循环后,两部分数组中可能有一个数组元素还未处理完,所以需要额外的处理,当然不可
  58.                 // 能两部分数组都有未处理完的元素,所以下面两个循环最多只有一个会执行,并且都是大于已放入
  59.                 // 临时数组中的元素
  60.                 while (part1ArrIndex <= mid) {
  61.                         tmpArr[tmpArrIndex++] = arr[part1ArrIndex++];
  62.                 }
  63.                 while (part2ArrIndex <= end) {
  64.                         tmpArr[tmpArrIndex++] = arr[part2ArrIndex++];
  65.                 }
  66.  
  67.                 // 最后把临时数组拷贝到源数组相同的位置
  68.                 System.arraycopy(tmpArr, 0, arr, from, end - from + 1);
  69.         }
  70.  
  71.         /**
  72.          * 测试
  73.          *
  74.          * @param args
  75.          */
  76.         public static void main(String[] args) {
  77.                 Integer[] intgArr = { 5, 9, 1, 4, 2, 6, 3, 8, 0, 7, -1, 0, -5, -2 };
  78.                 MergeSort insertSort = new MergeSort();
  79.                 insertSort.partition(intgArr, 0, intgArr.length - 1);
  80.                 for (Integer a : intgArr) {
  81.                         System.out.print(a + " ");
  82.                 }
  83.         }
  84. }
  85.  

回复 "java归并排序算法"

这儿你可以回复上面这条便签

captcha