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

Java編程中實(shí)現(xiàn)歸并排序算法的實(shí)例教程

 更新時(shí)間:2016年05月04日 11:37:16   作者:然則  
這篇文章主要介紹了Java編程中實(shí)現(xiàn)歸并排序算法的實(shí)例教程,包括自底向上的歸并排序的實(shí)現(xiàn)方法介紹,需要的朋友可以參考下

算法概述/思路
歸并排序是基于一種被稱為“分治”(divide and conquer)的策略。其基本思路是這樣的:
1.對(duì)于兩個(gè)有序的數(shù)組,要將其合并為一個(gè)有序數(shù)組,我們可以很容易地寫出如下代碼:

//both a and b is ascend.
public void merge(int[] a, int[] b, int[] c){
  int i=0,j=0,k=0;
  while (i<=a.length && j<=b.length){
    if (a[i]<=b[i]){
      c[k++]=a[i++];
    }
    else{
      c[k++]=b[j++];
    }
  }
  while (i<=a.length){
    c[k++]=a[i++];
  }
  while (j<=b.length){
    c[k++]=b[j++];
  }
}

容易看出,這樣的合并算法是高效的,其時(shí)間復(fù)雜度可達(dá)到O(n)。
2.假如有一個(gè)無序數(shù)組需要排序,但它的兩個(gè)完全劃分的子數(shù)組A和B分別有序,借助上述代碼,我們也可以很容易實(shí)現(xiàn);
3.那么,如果A,B無序,怎么辦呢?可以把它們?cè)俜殖筛〉臄?shù)組。
4.如此一直劃分到最小,每個(gè)子數(shù)組都只有一個(gè)元素,則可以視為有序數(shù)組。
5.從這些最小的數(shù)組開始,逆著上面的步驟合并回去,整個(gè)數(shù)組就排好了。
總而言之,歸并排序就是使用遞歸,先分解數(shù)組為子數(shù)組,再合并數(shù)組。

例子
下面舉例說明,假如要對(duì)數(shù)組a={2,1,3,5,2,3}進(jìn)行排序,那么把數(shù)組劃分為{2,1,3}和{5,2,3}兩個(gè)子數(shù)組,這兩個(gè)子數(shù)組排序后變?yōu)閧1,2,3}和{2,3,5},然后對(duì)這兩個(gè)數(shù)組進(jìn)行歸并操作便得到最終的有序數(shù)組。代碼實(shí)現(xiàn)如下:

void sort(int[] a) {
  int[] aux = new int[a.length];  //輔助數(shù)組
  mergeSort(a, 0, a.length - 1, aux);
}

void mergeSort(int[] a, int lo, int hi, int[] aux) {
  if (hi <= lo)
    return;
  int mid = lo + (hi - lo) / 2;
  mergeSort(a, lo, mid, aux);
  mergeSort(a, mid + 1, hi, aux);
  merge(a, lo, mid, hi, aux);

}

void merge(int[] a, int lo, int mid, int hi, int[] aux) {
  int i = lo, j = mid + 1;
  for (int k = lo; k <= hi; k++) {
    aux[k] = a[k];
  }
  for (int k = lo; k <= hi; k++) {
    if (i > mid)
      a[k] = aux[j++];
    else if (j > hi)
      a[k] = aux[i++];
    else if (aux[i] <= aux[j])
      a[k] = aux[i++];
    else
      a[k] = aux[j++];

  }
}

另一種實(shí)現(xiàn):自底向上的歸并排序
在上面的實(shí)現(xiàn)中,相當(dāng)于將一個(gè)大問題分割成小問題分別解決,然后用所有小問題的答案來解決整個(gè)大問題。將一個(gè)大的數(shù)組的排序劃分為小數(shù)組的排序是自頂向下的排序。還有一種實(shí)現(xiàn)是自底向上的排序,即先兩兩歸并,然后四四歸并......代碼實(shí)現(xiàn)如下:

void sort(int[] a) {
  int N = a.length;
  int[] aux = new int[N];
  for (int sz = 1; sz < N; sz += sz) {
    for (int lo = 0; lo < N - sz; lo += sz + sz) {
      //在每輪歸并中,最后一次歸并的第二個(gè)子數(shù)組可能比第一個(gè)子數(shù)組要小
      merge(a, lo, lo + sz - 1, Math.min(lo + sz + sz - 1, N - 1), aux);
    }
  }
}

相關(guān)文章

  • Java實(shí)現(xiàn)簡(jiǎn)單碰撞檢測(cè)

    Java實(shí)現(xiàn)簡(jiǎn)單碰撞檢測(cè)

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單碰撞檢測(cè),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 詳解Maven私服Nexus的安裝與使用

    詳解Maven私服Nexus的安裝與使用

    這篇文章主要介紹了詳解Maven私服Nexus的安裝與使用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-03-03
  • Java解壓rar文件的兩種實(shí)現(xiàn)方法

    Java解壓rar文件的兩種實(shí)現(xiàn)方法

    這篇文章主要介紹了Java解壓rar文件的兩種實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • springboot?整合?clickhouse的實(shí)現(xiàn)示例

    springboot?整合?clickhouse的實(shí)現(xiàn)示例

    本文主要介紹了springboot?整合?clickhouse的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Mybatis-plus出現(xiàn)數(shù)據(jù)庫id很大或者為負(fù)數(shù)的解決

    Mybatis-plus出現(xiàn)數(shù)據(jù)庫id很大或者為負(fù)數(shù)的解決

    本文主要介紹了Mybatis-plus出現(xiàn)數(shù)據(jù)庫id很大或者為負(fù)數(shù)的解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • cmd中javac命令無法運(yùn)行(java指令能運(yùn)行)解決步驟

    cmd中javac命令無法運(yùn)行(java指令能運(yùn)行)解決步驟

    這篇文章主要介紹了在安裝JDK后,執(zhí)行javac命令沒有返回值的問題,可能是由于命令提示符窗口緩存問題、系統(tǒng)路徑優(yōu)先級(jí)問題、文件權(quán)限問題或命令行輸入問題,文中通過代碼將解決的步驟介紹的非常詳細(xì),需要的朋友可以參考下
    2025-02-02
  • 在spring中手寫全局異常攔截器

    在spring中手寫全局異常攔截器

    這篇文章主要介紹了如何在spring中手寫全局異常攔截器,幫助大家更好的理解和使用spring框架,感興趣的朋友可以了解下
    2020-11-11
  • JAVA HashSet和TreeSet 保證存入元素不會(huì)重復(fù)的操作

    JAVA HashSet和TreeSet 保證存入元素不會(huì)重復(fù)的操作

    這篇文章主要介紹了JAVA HashSet和TreeSet 保證存入元素不會(huì)重復(fù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • 最簡(jiǎn)單的java生成word文檔方法

    最簡(jiǎn)單的java生成word文檔方法

    這篇文章主要介紹了java生成word文檔最簡(jiǎn)單的方法,首先說明,使用該方法時(shí),盡量不要使用wps新建word文檔,經(jīng)測(cè)試,手機(jī)不能兼容,出現(xiàn)很多格式問題,office則手機(jī)可以很好的兼容,所以,本文以office做教程
    2021-08-08
  • Java基于外觀模式實(shí)現(xiàn)美食天下食譜功能實(shí)例詳解

    Java基于外觀模式實(shí)現(xiàn)美食天下食譜功能實(shí)例詳解

    這篇文章主要介紹了Java基于外觀模式實(shí)現(xiàn)美食天下食譜功能,較為詳細(xì)的講述了外觀模式的概念、原理并結(jié)合實(shí)例形似詳細(xì)分析了Java基于外觀模式實(shí)現(xiàn)美食天下食譜功能的具體操作步驟與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2018-05-05

最新評(píng)論

越西县| 西藏| 石台县| 四会市| 乡宁县| 梓潼县| 桐城市| 达日县| 息烽县| 晋中市| 潜江市| 秦皇岛市| 宜兰县| 新邵县| 搜索| 社旗县| 清水县| 南汇区| 蕲春县| 盐亭县| 耿马| 顺平县| 东丰县| 义马市| 城固县| 格尔木市| 北辰区| 额尔古纳市| 邵阳市| 柳州市| 衡东县| 株洲市| 胶南市| 龙山县| 荆门市| 石狮市| 平和县| 集贤县| 上饶市| 凌源市| 旅游|