欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java 中歸并排序算法詳解

 更新時(shí)間:2017年09月22日 14:51:26   作者:愛(ài)寶貝丶  
這篇文章主要介紹了java 中歸并排序算法詳解的相關(guān)資料,歸并排序算法又稱(chēng)為合并排序算法,是一種時(shí)間復(fù)雜度為O(N logN)的排序算法,因而其在平常生活工作中應(yīng)用非常廣泛,需要的朋友可以參考下

java 中歸并排序算法詳解

 歸并排序算法,顧名思義,是一種先分再合的算法,其算法思想是將要排序的數(shù)組分解為單個(gè)的元素,每個(gè)元素就是一個(gè)單個(gè)的個(gè)體,然后將相鄰的兩個(gè)元素進(jìn)行從小到大或從大到小的順序排序組成一個(gè)整體,每個(gè)整體包含一到兩個(gè)元素,然后對(duì)相鄰的整體繼續(xù)“合”并,因?yàn)槊總€(gè)整體都是排過(guò)序的,因而可以采用一定的算法對(duì)其進(jìn)行合并,合并之后每個(gè)整體包含三到四個(gè)元素,繼續(xù)對(duì)相鄰的整體進(jìn)行合并,直到所有的整體都合并為一個(gè)整體,最終得到的整體就是將原數(shù)組進(jìn)行排序之后的結(jié)果。

       對(duì)于相鄰的整體,其合并的思想是每次都取兩個(gè)整體(假設(shè)其實(shí)按升序排序的)中最小的元素放到一個(gè)新數(shù)組中,依次循環(huán),最終兩個(gè)整體中的元素都被取完即可得到一個(gè)按升序排序的整體。該合并過(guò)程就像有兩個(gè)升序排序的牌堆A和B(如圖所示),每次從最頂上取出一個(gè)元素放到牌堆C中:

       從圖中可以看出,對(duì)于兩個(gè)相鄰的整體A和B,其內(nèi)的元素都是按升序排序的,現(xiàn)在有一個(gè)臨時(shí)數(shù)組C,然后對(duì)A和B頂部的兩個(gè)元素進(jìn)行比較,取出較小的一個(gè)元素放入C中,對(duì)于取出元素的整體,其指向元素的下標(biāo)下移一位,繼續(xù)取出兩個(gè)整體中頂部元素較小的一個(gè)放入C中,依次循環(huán),當(dāng)某個(gè)整體元素取完之后直接將另一個(gè)整體的元素都移入C中。對(duì)于C這個(gè)整體,其就是經(jīng)過(guò)A和B排序而得到的,由于A和B是相鄰的兩個(gè)整體,因而,最后只需要將C中的元素復(fù)制到A和B組成的一個(gè)共同整體中即可,這樣也就達(dá)到了將A和B合并的同時(shí)進(jìn)行排序的目的。

       以下是歸并排序的具體算法:

public class MergeSort {
 public static <AnyType extends Comparable<? super AnyType>> void mergeSort(AnyType[] arr) {
  AnyType[] tmp = ((AnyType[]) new Comparable[arr.length]);
  mergeSort(arr, 0, arr.length - 1, tmp);
 }

 private static <AnyType extends Comparable<? super AnyType>> void mergeSort(AnyType[] arr, int start, int end, AnyType[] tmp) {
  if (start < end) {
   int mid = (start + end) >> 1;
   mergeSort(arr, start, mid, tmp);
   mergeSort(arr, mid + 1, end, tmp);
   merge(arr, start, mid, end, tmp);
  }
 }

 private static <AnyType extends Comparable<? super AnyType>> void merge(AnyType[] arr, int start, int mid, int end, AnyType[] tmp) {
  int i = start, j = mid + 1, k = start;
  while (i <= mid && j <= end) {
   if (arr[i].compareTo(arr[j]) < 0) {
    tmp[k++] = arr[i++];
   } else {
    tmp[k++] = arr[j++];
   }
  }

  while (i <= mid) {
   tmp[k++] = arr[i++];
  }

  while (j <= end) {
   tmp[k++] = arr[j++];
  }

  for (int m = start; m <= end; m++) {
   arr[m] = tmp[m];
  }
 }
}

       代碼中主要有兩個(gè)方法

private static <AnyType extends Comparable<? super AnyType>> void mergeSort(AnyType[] arr, int start, int end, AnyType[] tmp)
private static <AnyType extends Comparable<? super AnyType>> void merge(AnyType[] arr, int start, int mid, int end, AnyType[] tmp)

       第一個(gè)方法是一個(gè)遞歸方法,對(duì)于遞歸方法,一定要明晰該方法功能的定義,這里這個(gè)遞歸方法的目的就是對(duì)傳入數(shù)組的start到end之間的元素進(jìn)行排序,而tmp則是一個(gè)輔助數(shù)組。在該方法的具體實(shí)現(xiàn)中,我們可以看到,其思路是首先對(duì)start到mid之間的元素繼續(xù)調(diào)用遞歸進(jìn)行排序,然后是對(duì)mid到end之間的元素調(diào)用遞歸進(jìn)行排序,經(jīng)過(guò)這兩個(gè)方法,從start到mid和從mid到end兩部分的元素都是經(jīng)過(guò)排序的,此時(shí)就需要調(diào)用第二個(gè)方法。

        第二個(gè)方法的功能是對(duì)兩個(gè)已經(jīng)排序的部分進(jìn)行合并,對(duì)于第一個(gè)方法,最后一步執(zhí)行了第二個(gè)方法也即對(duì)前面兩步排序的部分進(jìn)行合并之后也就完成了該方法的功能。而對(duì)于第二個(gè)方法,實(shí)現(xiàn)思路和前面描述的一樣,分別從兩堆牌頂取出較小的一個(gè)元素放入臨時(shí)數(shù)組中,當(dāng)一個(gè)牌堆取完之后就將剩下的數(shù)組的元素放入第二個(gè)牌堆,最后將臨時(shí)數(shù)組的元素放回到原始數(shù)組中。

       本文主要對(duì)歸并排序的思想進(jìn)行了詳細(xì)的講解,并且結(jié)合具體的代碼,結(jié)合思想對(duì)代碼進(jìn)行了一定的分析。

如有疑問(wèn)請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • SpringCache的基本使用方法

    SpringCache的基本使用方法

    Spring?Cache利用了AOP,實(shí)現(xiàn)了基于注解的緩存功能,并且進(jìn)行了合理的抽象,業(yè)務(wù)代碼不用關(guān)心底層是使用了什么緩存框架,只需要簡(jiǎn)單地加一個(gè)注解,就能實(shí)現(xiàn)緩存功能了,本文介紹SpringCache的基本使用方法,感興趣的朋友一起看看吧
    2024-01-01
  • Springboot工具類(lèi)FileCopyUtils使用教程

    Springboot工具類(lèi)FileCopyUtils使用教程

    這篇文章主要介紹了Springboot內(nèi)置的工具類(lèi)之FileCopyUtils的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-12-12
  • JDBC簡(jiǎn)介_(kāi)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    JDBC簡(jiǎn)介_(kāi)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    什么是JDBC?這篇文章就為大家詳細(xì)介紹了Java語(yǔ)言中用來(lái)規(guī)范客戶(hù)端程序如何來(lái)訪問(wèn)數(shù)據(jù)庫(kù)的應(yīng)用程序接口,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Java中常用的代碼匯總

    Java中常用的代碼匯總

    本文給大家分享了20個(gè)常用的java代碼,都是別人項(xiàng)目中使用過(guò)的代碼,這里推薦給大家,有需要的小伙伴可以參考下。
    2015-05-05
  • solr在java中的使用實(shí)例代碼

    solr在java中的使用實(shí)例代碼

    本篇文章主要介紹了solr在java中的使用實(shí)例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • Java?List集合取交集的8種不同實(shí)現(xiàn)方式總結(jié)

    Java?List集合取交集的8種不同實(shí)現(xiàn)方式總結(jié)

    工作中經(jīng)常遇到需要取兩個(gè)集合之間的交集、差集情況,下面這篇文章主要給大家總結(jié)介紹了關(guān)于Java?List集合取交集的8種不同實(shí)現(xiàn)方式,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-04-04
  • springboot文件上傳保存路徑的問(wèn)題

    springboot文件上傳保存路徑的問(wèn)題

    這篇文章主要介紹了springboot文件上傳保存路徑的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java對(duì)象和Json文本轉(zhuǎn)換工具類(lèi)的實(shí)現(xiàn)

    Java對(duì)象和Json文本轉(zhuǎn)換工具類(lèi)的實(shí)現(xiàn)

    Json?是一個(gè)用于Java對(duì)象和Json文本相互轉(zhuǎn)換的工具類(lèi),本文主要介紹了Java對(duì)象和Json文本轉(zhuǎn)換工具類(lèi),具有一定的參考價(jià)值,感興趣的可以了解一下
    2022-03-03
  • 詳解Java常用工具類(lèi)—泛型

    詳解Java常用工具類(lèi)—泛型

    這篇文章主要介紹了Java常用工具類(lèi)—泛型,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • SpringCloud集成Hystrix熔斷過(guò)程分步分解

    SpringCloud集成Hystrix熔斷過(guò)程分步分解

    通過(guò)hystrix可以解決雪崩效應(yīng)問(wèn)題,它提供了資源隔離、降級(jí)機(jī)制、融斷、緩存等功能。接下來(lái)通過(guò)本文給大家分享SpringCloud集成Hystrix熔斷,感興趣的朋友一起看看吧
    2022-09-09

最新評(píng)論