zoukankan      html  css  js  c++  java
  • 常见排序算法-----归并排序

     1     // 归并排序
     2     /**
     3      * 利用分而治之的思想, 将大的无序数组拆分 一直拆到不能再拆位置,进行合并
     4      * 
     5      * 很适合用于两个有序数组的合并
     6      */
     7     public static void main(String[] args) {
     8 
     9         MergeSort ms = new MergeSort();
    10         int[] arr = { 9, 8, 7, 6, 5, 4, 3, 2, 1 };
    11         ms.mergeSort(arr);
    12         for (int i = 0; i < arr.length; i++) {
    13             System.out.println(arr[i]);
    14         }
    15 
    16     }
    17 
    18     public void mergeSort(int[] arr) {
    19         // 先将数组分成左右两个数组
    20         int[] temp = new int[arr.length];
    21         for (int i = 0; i < temp.length; i++) {
    22             temp[i] = arr[i];
    23         }
    24         sort(arr, 0, arr.length - 1, temp);
    25     }
    26 
    27     public void sort(int[] arr, int start, int end, int[] temp) {
    28 
    29         if (start >= end) {
    30             return;
    31         }
    32 
    33         int mid = (start + end) >> 1;
    34 
    35         sort(arr, start, mid, temp);// 左边归并排序,使得左子序列有序
    36         sort(arr, mid + 1, end, temp);// 右边归并排序,使得右子序列有序
    37         merge(arr, start, mid, end, temp);// 将两个有序子数组合并操作
    38     }
    39 
    40     public void merge(int[] arr, int start, int mid, int end, int[] temp) {
    41 
    42         int i = start;
    43         int j = mid + 1;
    44         int index = start;
    45         while (i <= mid && j <= end) {
    46             if (arr[i] < arr[j]) {
    47                 temp[index] = arr[i];
    48                 i++;
    49             } else {
    50                 temp[index] = arr[j];
    51                 j++;
    52             }
    53             index++;
    54         }
    55 
    56         if (i == mid + 1) {
    57             for (int k = j; k <= end; k++) {
    58                 temp[index] = arr[k];
    59                 index++;
    60             }
    61         } else {
    62             for (int k = i; k < mid + 1; k++) {
    63                 temp[index] = arr[k];
    64                 index++;
    65             }
    66         }
    67         for (int k = 0; k < temp.length; k++) {
    68             arr[k] = temp[k];
    69         }
    70 
    71     }

     先拆分 拆分到最底层后 在排序合并  稳定算法  归并排序的最好,最坏,平均时间复杂度均为O(nlogn)。

    详见 https://www.cnblogs.com/chengxiao/p/6194356.html 

  • 相关阅读:
    aspose.word 页脚插入图片图片浮动
    Aspose.Words插入表格,表格居中显示
    git常用命令
    openlayers之矢量加载标记点
    三、反射、动态加载
    openlayers交互之多边形
    openlayers轨迹回放
    openlayers交互之线
    关闭2000的默认共享
    开始blog,有点晚,但还是早
  • 原文地址:https://www.cnblogs.com/maxbolg/p/9347043.html
Copyright © 2011-2022 走看看