問題描述:
問題來自習題6.5-8 給出乙個時間為o(nlgk),用來將k個已排序鍊錶合併為乙個排序鍊錶的演算法。
在k路歸併問題中,取出最小堆的根元素(最小元素)後,如果此元素沒有後繼元素(next為空),
則有兩種方案:
一、從k路中的另乙個鍊錶取出乙個元素放到根位置。
二、將堆底部最後乙個元素挪到根位置,並將堆大小減一。
此處採用方案二。堆大小每減一,說明k路中某乙個鍊錶已處理完。
當堆大小為零時,處理結束。
原始碼與注釋:
// 鍊錶結點類
class
node
public
class
kmerge
system.
out.println(); }
public
static
linkedlistkmerge(linkedlist> klists)
else
// 根位置的堆性質被破壞,重新恢復。
minheapify
(heap, heapsize, 1);
}return
resultlist; }
public
static
void
buildmaxheap(node heap,
int
heapsize)
public
static
void
minheapify(node heap,
int
heapsize,
int
i) }
public
static
linkedlistcreatelist(
int
... values)
return
list; }
}效率分析:
堆的大小為k,呼叫buildmaxheap()建堆花費klgk。剩餘元素為n - k個。
每次取出根元素,放入後繼元素後,呼叫maxheapify()保持堆性質花費lgk。
所以總的時間為klgk + (n - k)lgk = nlgk。
《演算法導論》 第6章堆排序
include include using namespace std 定義結構體,其中包含陣列長alength,堆長heap size。struct dui 返回堆中元素i的父結點的下標 i 2向下取整,即i進行左移一位操作。int parent int i 返回堆中元素i的左孩子的下標 i 2 ...
演算法導論第6章 堆排序
本章開始介紹了堆的基本概念,然後引入最大堆和最小堆的概念。全章採用最大堆來介紹堆的操作,兩個重要的操作是調整最大堆和建立最大堆,接著著兩個操作引進了堆排序,最後介紹了採用堆實現優先順序佇列。1 堆 堆給人的感覺是乙個二叉樹,但是其本質是一種陣列物件,因為對堆進行操作的時候將堆視為一顆完全二叉樹,樹種...
《演算法導論》筆記 第6章 堆排序
第6章 堆排序 本章主要介紹了堆的基本知識和幾個基本操作過程 堆 二叉 堆資料結構是一種陣列物件,它可以被看作是一棵完全二叉樹。heap size a 即堆的大小是已知的,樹的根結點是a 1 某個i結點,它的父結點parent i 為,左兒子left i 和右兒子right i 的下標可以簡單地計算...