基礎演算法學習之 三 堆排序

2021-09-18 04:14:18 字數 911 閱讀 2210

分為兩步,建堆與維持堆的性質,首先我們要先理解堆是什麼東西.

堆其實就是乙個完全二叉樹,我們可以使用順序表儲存乙個二叉樹,如下圖所示來儲存:

其中分為最大堆最小堆,而最大堆就是上頭大,下頭小;最小堆則反之.

明白了堆的定義我們就可以開始學習堆排序了,堆排序其實也是分為有序區與無序區,其中無序區就是我們建好的最大堆,根節點就是堆中最大的數,我們逐個讓最大元素進有序區並對堆結構進行調整,維持根節點最大的性質,直到堆中元素清空為止,就是堆排序的過程.

//工具函式

function swapitem(pre,next,arr)

function getleft(i)

function getright(i)

//維持堆的性質

function heapadjust(arr,i,len)else

if(r < len&&arr[r] > arr[large])

//上述**就是取節點也子節點三個元素之間的最大值

if(large !== i)

}//建堆

function heapbuild(arr,len)

}//堆排序本體如下

function heapsort(arr)

}//測試**

var arr=[91,60,96,13,35,65,46,65,10,30,20,31,77,81,22];

heapsort(arr);

console.log(arr);

演算法學習(三)堆排序

要弄清楚堆排序,我們首先要懂得以下兩點 1 邏輯上的結構,怎麼樣才是乙個堆。2 儲存上的結構,乙個堆儲存起來的結構是怎麼樣的。一般來講,堆排序中的 堆 指的是二叉堆,一種完全二叉樹的結構,每個父結點最多只有兩個子結點,且滿足兩點 1 父結點總是大於 小於 其兩個子結點 大於的,我們叫最大堆,小於的,...

排序演算法 三 堆排序

1.heap.class package cn.sort.heap 堆排序實現 公升序排序 author ly public class heap system.out.println 向下調整 先拿左右子樹進行比較,看誰比較大,然後再拿大的與父結點進行比較,若孩子結點比較大,則大孩子與父結點交換,...

排序之三 堆排序 可列印排序流程

public class heapsort public static heapsort getinstance return sinstance 堆排序演算法入口 param arr 建議使用個位數陣列測試方便直觀觀察排序過程 0 3 4 2 5 6 1 return 排序後陣列 public i...