一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java代碼為例講解堆的性質和基本操作以及排序方法

Java代碼為例講解堆的性質和基本操作以及排序方法

2020-05-13 14:22林壽山 JAVA教程

堆數據結構可以看作一顆完全二叉樹,因而又被成為二叉堆,這里我們以Java代碼為例講解堆的性質和基本操作以及排序方法,需要的朋友可以參考下

堆的性質
堆是一棵完全二叉樹,實際中可以通過一個數組來實現,它最重要的一個性質是:任意節點都小于(大于)等于其子節點。將根節點最小的堆稱為最小堆,根節點最大的堆稱為最大堆。下圖給出了一個最大堆的示例及其數組表示,可以直觀地看出每個節點都比它的孩子們都要大。

Java代碼為例講解堆的性質和基本操作以及排序方法

在上圖中可以看到,完全二叉樹的節點可以從根節點編號為1開始按順序排列,對應數組A中的索引(注意此處下標是從1開始的)。給定一個節點i,我們很容易可以得到它的左孩子是2i,右孩子是2i+1,父節點是i/2

堆的基本操作
堆有兩種基本操作(下面以最小堆為例):
插入元素k:直接將k添加到數組最后,然后向上冒泡(bubble-up)調整堆。向上冒泡操作:將要調整的元素與其父節點比較,如果大于其父節點則交換,直到恢復堆的性質。
提取最值:最值即根元素。然后將其刪除,令根元素=最后的葉子結點元素,然后從根元素開始向下冒泡(bubble-down)調整堆。向下冒泡操作:每次應該從要調整節點,其左右孩子一共三個節點中選擇最小的子節點來交換(如果最小就是其本身就不用交換),直到恢復堆的性質。
實際中經常需要將一個包含n個元素無序數組建立成堆,下面的Heap類中的構造方法將展示如何通過_bubbleDown向下冒泡調整來建堆。堆實質上是一棵完全二叉樹,樹高總為lognlog?n,每種基本操作的耗時操作都在于冒泡調整以滿足堆的性質,因此它們的時間復雜度都是O(nlogn)O(nlog?n)。
Java示例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//上浮
public void swim(int k){
  while(k/2>=1 && less(pq[k/2],pq[k])){
    exch(pq,k/2,k);
    k=k/2;
  }
}
//下沉
private void sink() {
  int k=1;
  while(2*k<N){
    int j=2*k;
    if(less(pq[j],pq[j+1])) j++;
    if(less(pq[k],pq[j])) exch(pq,k,j);
    else break;
    k = j;
  }
}
 

堆排序實現原理
分為兩步:
1.把數組排成二叉堆的順序
2.調換根節點和最后一個節點的位置,然后對根節點進行下沉操作。

Java代碼為例講解堆的性質和基本操作以及排序方法

實現:
可能我的代碼和上面的動畫略有出入,不過基本原理差不多。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class HeapSort extends BaseSort {
 
  private int N;
  @Override
  public void sort(Comparable[] a) {
    N =a.length-1;
    int k = N/2;
    while(k>=1){
      sink(a,k);
      k--;
    }
    k = 1;
    while(k<=N){
      exch(a,k,N--);
      sink(a,k);
    }
  }
}
 

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 女王脚奴vk | 日韩精品亚洲一级在线观看 | 亚洲成a人不卡在线观看 | 久久无码AV亚洲精品色午夜麻豆 | 好湿好滑好硬好爽好深视频 | 91短视频在线播放 | 办公室大战秘书呻吟 | 精品亚洲一区二区三区在线播放 | 91尤物在线播放 | 日本美女视频韩国视频网站免费 | 免费网站看v片在线香蕉 | 成人资源影音先锋久久资源网 | 色婷婷久久综合中文久久一本 | 免费超级乱淫视频播放性 | 福利视频导航大全 | 国内精品一区二区三区东京 | 国产成人小视频在线观看 | 久久精品国产久精国产果冻传媒 | 青青青国产 | 国产首页精品 | 四缺一小说 | 亚洲欧美日韩另类在线一 | 亚洲免费闲人蜜桃 | 91制片厂制作传媒免费版樱花 | 久久内在线视频精品mp4 | 日本护士厕所xxx | 国产精品玖玖玖影院 | 亚洲社区在线 | 无遮挡免费h肉动漫在线观看 | 国产99视频精品免费视频免里 | 美女被扣逼| 四虎最新紧急更新地址 | 给我免费观看的视频在线播放 | 国产第一自拍 | 亚洲精品久久啪啪网站成年 | 男人的天堂在线 | 91果冻制片厂天美传媒 | 波多洁野衣一二区三区 | 国产精品福利一区二区亚瑟 | 欧美一级专区免费大片 | 隔壁的漂亮邻居hd中文 |