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

Java算法之堆排序代碼示例

 更新時(shí)間:2017年11月07日 11:11:52   作者:分享是最好的記憶  
這篇文章主要介紹了Java算法之堆排序代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。

堆是一種特殊的完全二叉樹(shù),其特點(diǎn)是所有父節(jié)點(diǎn)都比子節(jié)點(diǎn)要小,或者所有父節(jié)點(diǎn)都比字節(jié)點(diǎn)要大。前一種稱(chēng)為最小堆,后一種稱(chēng)為最大堆。

比如下面這兩個(gè):

 那么這個(gè)特性有什么作用?既然題目是堆排序,那么肯定能用來(lái)排序。想要用堆排序首先要?jiǎng)?chuàng)建一個(gè)堆,如果對(duì)4 3 6 2 7 1 5這七個(gè)數(shù)字做從小到大排序,需要用這七個(gè)數(shù)創(chuàng)建一個(gè)最大堆,來(lái)看代碼:

public class HeapSort {
  private int[] numbers;
  private int length;
  public HeapSort(int[] numbers) {
    this.numbers = numbers;
    this.length = numbers.length;
  }
  /**
   * 調(diào)整二叉樹(shù)
   * 如果父節(jié)點(diǎn)編號(hào)為x, 那么左子節(jié)點(diǎn)的編號(hào)是2x, 右子節(jié)點(diǎn)的編號(hào)是2x+1
   * 節(jié)點(diǎn)編號(hào)從1開(kāi)始, 對(duì)應(yīng)數(shù)組中的索引是編號(hào)-1
   * @param nodeId 節(jié)點(diǎn)編號(hào), 從1開(kāi)始
   */
  public void adjust(int nodeId) {
    int swapId;
    int flag = 0; //是否需要繼續(xù)向下調(diào)整
    while(nodeId * 2 <= this.length && flag == 0) {
      //首先判斷它和左子節(jié)點(diǎn)的關(guān)系, 并用swapId記錄值較小的節(jié)點(diǎn)編號(hào)(最大堆是記錄較大的)
      int index = nodeId - 1; //節(jié)點(diǎn)對(duì)應(yīng)數(shù)組中數(shù)字的索引
      int leftChild = nodeId * 2 - 1; //左子節(jié)點(diǎn)對(duì)應(yīng)數(shù)組中數(shù)字的索引
      int rightChild = nodeId * 2; //右子節(jié)點(diǎn)對(duì)應(yīng)數(shù)組中數(shù)字的索引
      if(numbers[index] < numbers[leftChild]) {
        swapId = nodeId * 2;
      } else {
        swapId = nodeId;
      }
      //如果有右子節(jié)點(diǎn), 再與右子節(jié)點(diǎn)比較
      if(nodeId * 2 + 1 <= this.length) {
        if(numbers[swapId - 1] < numbers[rightChild])
          swapId = nodeId * 2 + 1;
      }
      //如果最小的節(jié)點(diǎn)編號(hào)不是自己, 說(shuō)明子節(jié)點(diǎn)中有比父節(jié)點(diǎn)更小的
      if(swapId != nodeId) {
        swap(swapId, nodeId);
        nodeId = swapId;
      } else {
        flag = 1;
      }
    }
  }
  /**
   * 交換兩個(gè)節(jié)點(diǎn)的值
   * @param nodeId1
   * @param nodeId2
   */
  public void swap(int nodeId1, int nodeId2) {
    int t = numbers[nodeId1 - 1];
    numbers[nodeId1 - 1] = numbers[nodeId2 - 1];
    numbers[nodeId2 - 1] = t;
  }
  /**
   * 創(chuàng)建最大堆
   */
  public void createMaxHeap() {
    //從最后一個(gè)非葉節(jié)點(diǎn)到第一個(gè)節(jié)點(diǎn)依次向上調(diào)整
    for(int i = this.length / 2; i >= 1; i--) {
      adjust(i);
    }
  }
  public static void main(String[] args) {
    int[] numbers = new int[] { 4, 3, 6, 2, 7, 1, 5 };
    for(int x = 0; x < numbers.length; x++) {
      System.out.print(numbers[x] + " ");
    }
    System.out.println();
    HeapSort heap = new HeapSort(numbers);
    heap.createMaxHeap();
  }
}

對(duì)本例中的數(shù)列,從this.length / 2到1,共執(zhí)行了三輪循環(huán)。

第一輪:

第二輪:

第三輪:

調(diào)整完成后,當(dāng)前的二叉樹(shù)已經(jīng)符合最大堆的特性,可以用來(lái)從小到大排序。堆排序的原理是,交換堆頂和最后一個(gè)節(jié)點(diǎn)的數(shù)字,即把最大的數(shù)字放到數(shù)組最后,然后對(duì)除了最大數(shù)的前n-1個(gè)數(shù)從新執(zhí)行調(diào)整過(guò)程,使其符合最大堆特性。重復(fù)以上過(guò)程直到堆中只剩下一個(gè)數(shù)字。

public void sort() {
  while(this.length > 1) {
    swap(1, this.length);
    this.length--;
    adjust(1);
  }
  for(int x = 0; x < numbers.length; x++) {
    System.out.print(numbers[x] + " ");
  }
}

堆排序的時(shí)間復(fù)雜度和快速排序的平均時(shí)間復(fù)雜度一樣,是O(nlogn)。

總結(jié)

以上就是本文關(guān)于Java算法之堆排序代碼示例的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:java實(shí)現(xiàn)的各種排序算法代碼示例Java遺傳算法之沖出迷宮等,有什么問(wèn)題可以隨時(shí)留言,小編會(huì)及時(shí)回復(fù)大家的。感謝朋友們對(duì)本站的支持!

相關(guān)文章

  • java8新特性之接口的static和default的使用

    java8新特性之接口的static和default的使用

    這篇文章主要介紹了java8新特性之接口的static和default的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • 深入IDEA Debug問(wèn)題透析詳解

    深入IDEA Debug問(wèn)題透析詳解

    這篇文章主要為大家介紹了深入IDEA Debug問(wèn)題透析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Spring Aop 源碼增強(qiáng)獲取分享

    Spring Aop 源碼增強(qiáng)獲取分享

    這篇文章主要介紹了Spring Aop 源碼增強(qiáng)獲取分享,文章圍繞主題的內(nèi)容展開(kāi)Spring Aop的相關(guān)介紹,具有一定的參考價(jià)值需要的小伙伴可以參考一下
    2022-05-05
  • 淺談Java開(kāi)發(fā)架構(gòu)之領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)DDD落地

    淺談Java開(kāi)發(fā)架構(gòu)之領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)DDD落地

    DDD(Domain-Driven Design 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì))是由Eric Evans最先提出,目的是對(duì)軟件所涉及到的領(lǐng)域進(jìn)行建模,以應(yīng)對(duì)系統(tǒng)規(guī)模過(guò)大時(shí)引起的軟件復(fù)雜性的問(wèn)題
    2021-06-06
  • Java版本的回文字算法(java版本)

    Java版本的回文字算法(java版本)

    本文給大家分享一段java代碼關(guān)于回文字算法的實(shí)例代碼,代碼簡(jiǎn)單易懂,需要的朋友一起看看吧
    2016-10-10
  • 詳解Maven倉(cāng)庫(kù)之本地倉(cāng)庫(kù)、遠(yuǎn)程倉(cāng)庫(kù)

    詳解Maven倉(cāng)庫(kù)之本地倉(cāng)庫(kù)、遠(yuǎn)程倉(cāng)庫(kù)

    這篇文章主要介紹了Maven倉(cāng)庫(kù)之本地倉(cāng)庫(kù)、遠(yuǎn)程倉(cāng)庫(kù),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • JVM中的GC初識(shí)

    JVM中的GC初識(shí)

    GC(Garbage Collection)稱(chēng)之為垃圾回收,是對(duì)內(nèi)存中的垃圾對(duì)象,采用一定的算法進(jìn)行內(nèi)存回收的一個(gè)動(dòng)作,這篇文章主要介紹了JVM中的GC初識(shí),需要的朋友可以參考下
    2022-05-05
  • Spring5使用JSR 330標(biāo)準(zhǔn)注解的方法

    Spring5使用JSR 330標(biāo)準(zhǔn)注解的方法

    從Spring3.0之后,除了Spring自帶的注解,我們也可以使用JSR330的標(biāo)準(zhǔn)注解,本文主要介紹了Spring5使用JSR 330標(biāo)準(zhǔn)注解,感興趣的可以了解一下
    2021-09-09
  • Java之網(wǎng)絡(luò)編程案例講解

    Java之網(wǎng)絡(luò)編程案例講解

    這篇文章主要介紹了Java之網(wǎng)絡(luò)編程案例講解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 淺談MyBatis循環(huán)Map(高級(jí)用法)

    淺談MyBatis循環(huán)Map(高級(jí)用法)

    這篇文章主要介紹了淺談MyBatis循環(huán)Map(高級(jí)用法),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09

最新評(píng)論

错那县| 名山县| 丽水市| 宁城县| 巩义市| 陕西省| 柳河县| 磐安县| 宝兴县| 且末县| 张家港市| 修文县| 唐海县| 江都市| 太谷县| 海兴县| 太仆寺旗| 阳原县| 股票| 安顺市| 应城市| 永康市| 涞水县| 三原县| 凤冈县| 武夷山市| 高阳县| 静宁县| 华蓥市| 全椒县| 山丹县| 沅江市| 芜湖市| 安塞县| 磐石市| 洪雅县| 阳原县| 宁国市| 水城县| 永年县| 淮安市|