最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java數(shù)據(jù)結(jié)構(gòu)排序算法之歸并排序詳解

 更新時間:2017年05月29日 12:03:25   作者:android小豬  
這篇文章主要介紹了java數(shù)據(jù)結(jié)構(gòu)排序算法之歸并排序,結(jié)合具體實例形式詳細分析了歸并排序的原理、實現(xiàn)技巧與相關注意事項,需要的朋友可以參考下

本文實例講述了java數(shù)據(jù)結(jié)構(gòu)排序算法之歸并排序。分享給大家供大家參考,具體如下:

在前面說的那幾種排序都是將一組記錄按關鍵字大小排成一個有序的序列,而歸并排序的思想是:基于合并,將兩個或兩個以上有序表合并成一個新的有序表

歸并排序算法:假設初始序列含有n個記錄,首先將這n個記錄看成n個有序的子序列,每個子序列長度為1,然后兩兩歸并,得到n/2個長度為2(n為奇數(shù)的時候,最后一個序列的長度為1)的有序子序列。在此基礎上,再對長度為2的有序子序列進行亮亮歸并,得到若干個長度為4的有序子序列。如此重復,直到得到一個長度為n的有序序列為止。這種方法被稱作是:2-路歸并排序(基本操作是將待排序列中相鄰的兩個有序子序列合并成一個有序序列)。

算法實現(xiàn)代碼如下:

package exp_sort;
public class MergeSort {
  /**
   * 相鄰兩個有序子序列的合并算法
   *
   * @param src_array
   * @param low
   * @param high
   * @param des_array
   */
  public static void Merge(int src_array[], int low, int high,
      int des_array[]) {
    int mid;
    int i, j, k;
    mid = (low + high) / 2;
    i = low;
    k = 0;
    j = mid + 1;
    // compare two list
    while (i <= mid && j <= high) {
      if (src_array[i] <= src_array[j]) {
        des_array[k] = src_array[i];
        i = i + 1;
      } else {
        des_array[k] = src_array[j];
        j = j + 1;
      }
      k = k + 1;
    }
    // if 1 have,cat
    while (i <= mid) {
      des_array[k] = src_array[i];
      k = k + 1;
      i = i + 1;
    }
    while (j <= high) {
      des_array[k] = src_array[j];
      k = k + 1;
      j = j + 1;
    }
    for (i = 0; i < k; i++) {
      src_array[low + i] = des_array[i];
    }
  }
  /**
   * 2-路歸并排序算法,遞歸實現(xiàn)
   *
   * @param src_array
   * @param low
   * @param high
   * @param des_array
   */
  public static void mergeSort(int src_array[], int low, int high,
      int des_array[]) {
    int mid;
    if (low < high) {
      mid = (low + high) / 2;
      mergeSort(src_array, low, mid, des_array);
      mergeSort(src_array, mid + 1, high, des_array);
      Merge(src_array, low, high, des_array);
    }
  }
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    int array1[] = { 38, 62, 35, 77, 55, 14, 35, 98 };
    int array2[] = new int[array1.length];
    mergeSort(array1, 0, array1.length - 1, array2);
    System.out.println("\n----------after sort-------------");
    for (int ii = 0; ii < array1.length; ii++) {
      System.out.print(array1[ii] + " ");
    }
    System.out.println("\n");
  }
}

代碼解釋:

歸并排序中一趟歸并要多次調(diào)用到2-路歸并算法,一趟的歸并的時間復雜度是O(n),合并兩個已經(jīng)排好序的表的時間顯然是線性的,因為最多進行了n-1次比較,其中n是元素的總數(shù)。如果有多個數(shù),即n不為1時,遞歸的將前半部分數(shù)據(jù)和后半部分數(shù)據(jù)各自歸并排序,得到排序后的兩部分數(shù)據(jù),再合并到一起。

算法分析:

該算法是建立在歸并操作(也叫歸并算法,指的是將兩個已經(jīng)排序的序列合并成一個序列的操作)上的一種有效的排序算法。該算法是采用分治法(Divide and Conquer)的一個非常典型的應用,它將問題分成一些小的問題然后遞歸求解,而治的階段則是將分的階段解得的各個答案修補到一塊;分治是遞歸非常有力的用法。注意:與快速·排序和堆排序比較,歸并排序最大的特點就是,它一種穩(wěn)定的排序方法。速度僅次于快速排序,一般用于對總體無序,但是各子項相對有序的數(shù)列。

復雜度:

時間復雜度為:O(nlogn) ——該算法最好、最壞和平均的時間性能。
空間復雜度為 :O(n)
比較操作的次數(shù)介于(nlogn) / 2和 nlogn - n + 1之間。
賦值操作的次數(shù)是(2nlogn)。歸并算法的空間復雜度為:0 (n)
很難用于主存排序(歸并排序比較占用內(nèi)存,主要問題在于合并兩個排序的表需要線性附加內(nèi)存,在整個算法中還要花費將數(shù)據(jù)拷貝到臨時數(shù)組再拷貝回來這樣的一些附加操作,其結(jié)果嚴重放慢了排序的速度)但是效率很高,主要用于外部排序,對于重要的內(nèi)部排序應用而言,一般還是選擇快速排序。

歸并操作的步驟如下:

第一步:申請空間,使其大小為兩個已經(jīng)排序序列之和,該空間用來存放合并后的序列
第二步:設定兩個指針,最初位置分別為兩個已經(jīng)排序序列的起始位置
第三步:比較兩個指針所指向的元素,選擇相對小的元素放入到合并空間,并移動指針到下一位置
重復步驟3直到某一指針達到序列尾
將另一序列剩下的所有元素直接復制到合并序列尾

歸并排序的步驟如下(假設序列共有n個元素):

將序列每相鄰兩個數(shù)字進行歸并操作(merge),形成floor(n/2)個序列,排序后每個序列包含兩個元素
將上述序列再次歸并,形成floor(n/4)個序列,每個序列包含四個元素
重復步驟2,直到所有元素排序完畢

更多關于java算法相關內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總

希望本文所述對大家java程序設計有所幫助。

相關文章

  • JAVA實現(xiàn)往字符串中某位置加入一個字符串

    JAVA實現(xiàn)往字符串中某位置加入一個字符串

    這篇文章主要介紹了JAVA實現(xiàn)往字符串中某位置加入一個字符串,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • SpringMVC中的DispatcherServlet請求分析

    SpringMVC中的DispatcherServlet請求分析

    這篇文章主要介紹了SpringMVC中的DispatcherServlet請求分析, DispatcherServlet作為一個Servlet,那么當有請求到Tomcat等Servlet服務器時,會調(diào)用其service方法,再調(diào)用到其父類GenericServlet的service方法,需要的朋友可以參考下
    2024-01-01
  • CyclicBarrier線程同步共享變量底層原理示例解析

    CyclicBarrier線程同步共享變量底層原理示例解析

    這篇文章主要為大家介紹了CyclicBarrier線程同步共享變量底層原理示例解析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • Java中Object類常用的12個方法(小結(jié))

    Java中Object類常用的12個方法(小結(jié))

    Java 中的 Object 方法在面試中是一個非常高頻的點,本文主要介紹了Java中Object類常用的12個方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Eclipse使用maven搭建spring mvc圖文教程

    Eclipse使用maven搭建spring mvc圖文教程

    這篇文章主要為大家分享了Eclipse使用maven搭建spring mvc圖文教程,感興趣的小伙伴們可以參考一下
    2016-05-05
  • Java報錯:UnsupportedOperationException in Collections的解決方案

    Java報錯:UnsupportedOperationException in Collection

    在Java編程中,UnsupportedOperationException是一種常見的運行時異常,通常在試圖對不支持的操作執(zhí)行修改時發(fā)生,它表示當前操作不被支持,本文將深入探討UnsupportedOperationException的產(chǎn)生原因,并提供具體的解決方案和最佳實踐,需要的朋友可以參考下
    2024-06-06
  • spring boot容器啟動流程

    spring boot容器啟動流程

    spring cloud是基于spring boot快速搭建的,今天咱們就看看spring boot容器啟動流程,需要的朋友跟隨腳本之家小編一起學習吧
    2018-01-01
  • SpringCloud微服務架構(gòu)實戰(zhàn)之微服務治理功能的實現(xiàn)

    SpringCloud微服務架構(gòu)實戰(zhàn)之微服務治理功能的實現(xiàn)

    這篇文章主要介紹了SpringCloud微服務架構(gòu)實戰(zhàn)之微服務治理,這些治理工具主要包括服務的注冊與發(fā)現(xiàn)、負載均衡管理、動態(tài)路由、服務降級和故障轉(zhuǎn)移、鏈路跟蹤、服務監(jiān)控等,需要的朋友可以參考下
    2022-02-02
  • java如何強制刪除java程序占用的文件

    java如何強制刪除java程序占用的文件

    這篇文章主要介紹了java如何強制刪除java程序占用的文件問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Java中的方法、常量、變量、參數(shù)用例詳解

    Java中的方法、常量、變量、參數(shù)用例詳解

    在JVM的運轉(zhuǎn)中,承載的是數(shù)據(jù),而數(shù)據(jù)的一種變現(xiàn)形式就是“量”,量分為:常量與變量,我們在數(shù)學和物理學中已經(jīng)接觸過變量的概念了,在Java中的變量就是在程序運行過程中可以改變其值的量,這篇文章主要介紹了Java中的方法、常量、變量、參數(shù),需要的朋友可以參考下
    2024-01-01

最新評論

台中市| 田阳县| 建阳市| 汶上县| 甘德县| 华容县| 江城| 沐川县| 蒙阴县| 南召县| 阳西县| 鱼台县| 隆林| 集安市| 多伦县| 谢通门县| 眉山市| 灵山县| 聊城市| 娄烦县| 威远县| 新干县| 紫金县| 毕节市| 柏乡县| 吴堡县| 东乌珠穆沁旗| 汝州市| 壶关县| 江西省| 大石桥市| 晋江市| 泉州市| 沿河| 乐山市| 胶州市| 上犹县| 景谷| 从江县| 皮山县| 瑞安市|