摘要: 排序在最壞的情況下,其時間復(fù)雜度也能達(dá)到O(nlogn)。相對于快速排序來說,這是它最大的優(yōu)點(diǎn),此外,堆排序僅需要一個記錄大小供交換用的輔助存儲空間。
堆排序的數(shù)據(jù)結(jié)構(gòu)是二叉堆,二叉堆的特點(diǎn)有兩個,一個是它是一棵完全二叉樹,另一個是它的根結(jié)點(diǎn)小于孩子結(jié)點(diǎn),所以我們很容易找到它的最小結(jié)點(diǎn)----根結(jié)點(diǎn);當(dāng)然如果你想找到最大結(jié)點(diǎn)的話,那就要掃描所有的葉子結(jié)點(diǎn),這是很費(fèi)時間的,如果你想找的是最大結(jié)點(diǎn)的話,你最好把它弄成一個大頂堆,即一棵根結(jié)點(diǎn)大于孩子結(jié)點(diǎn)的完全二叉樹。
二叉堆通常用數(shù)組來實(shí)現(xiàn),它舍棄下標(biāo)0,從下標(biāo)1開始置數(shù),則很容易滿足,對于數(shù)組中任意位置i上的元素,其左兒子的位置在2i上,右兒子的位置在2i+1上,雙親的位置則在i/2上。
堆排序的算法之一是把數(shù)組構(gòu)建成二叉堆----這只要增添一個長度為n+1的輔助空間,然后把原數(shù)組的元素依次插入到二叉堆即可。然后刪除二叉堆的根,把它作為排序后的數(shù)組的第一個元素,然后使二叉堆的長度減1,并通過上移使得新得到的序列仍為二叉堆,再提取新二叉堆的第一個元素到新數(shù)組。依此類推,直到提取最后
閱讀全文