《演算法導論》第6章 堆排序 3 K路歸併

2021-08-26 17:00:42 字數 1488 閱讀 9730

問題描述:

問題來自習題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 的下標可以簡單地計算...