演算法筆記 005 堆排序問題 變治法

2022-03-25 17:16:56 字數 2325 閱讀 4866

目錄1 問題描述2 解決方案2.1  堆排序原理簡介

2.2  變治法原理簡介

2.3  具體編碼

2.4  執行結果截圖

用基於變治法的堆排序演算法對任意一組給定的資料進行排序

1)深刻理解並掌握變治法的設計思想;

2)掌握堆的概念以及如何用變治法把任意給定的一組資料改變成堆;

3)提高應用變治法設計演算法的技能。

1)設計與實現堆排序演算法;

2)待排序的資料可以手工輸入

(通常規模比較小,

10個資料左右),用以檢測程式的正確性;也可以計算機隨機生成(通常規模比較大,

1500

-3000

個資料左右),用以檢驗

(用計數法

)堆排序演算法的時間效率。

堆可以定義為一顆二叉樹,樹的節點中包含鍵(每個節點是乙個鍵),並且滿足下面兩個條件:

(1)樹的形狀要求——這顆二叉樹是基本完備的(或者簡稱為完成二叉樹),這意味著,樹的每一層都是滿的,除了最後一層最右邊的元素有可能缺位。

(2)父母優勢要求,又稱為堆特性——每乙個節點的鍵都要大於或等於它子女的鍵(對於任何孩子節點也要自動滿足父母優勢要求)。

變治法:首先,在「變」的階段,出於這一或者那樣的原因,把問題的例項變得更容易求解(ps

根據我們對問題例項的變換方式,變治思想有3種主要的型別:

(1)變換為同樣問題的乙個更簡單或者更方便的例項——我們稱之為例項化簡;

(2)變換為同樣例項的不同表現——我們稱之為改變表現;

(3)變換為另乙個問題的例項,這種問題的演算法是已知的——我們稱之為問題的化簡。

package

com.liuzhen.heapsort;

public

class

heapsort

}else

}return

array;

}//根據堆排序父母優勢規則,返回乙個給定長度的陣列的成堆結果

public

static

int getheapsort(int array , int

len)}}

//遍歷陣列array,一旦出現根節點小於其葉子節點時,跳出for迴圈

intj;

for(j = 1;j < len/2;j++)

if((2*j) == len-1)

}if(j == len/2) //

如果j==len/2,說明遍歷結果符合堆排序規則,直接結束while迴圈

judge = false

; }

return

array;

}//使用陣列成堆,對乙個陣列元素進行從小到大排序,並返回排序後的結果

public

static

int getresultsort(int array , int

len)

return

array;

}//初始化乙個長度為n的隨機數組

public

static

int initarray(int

n)

public

static

void

main(string args); //

此處定義陣列,對array[1]到array[len-1]進行排序

int len =array.length;

int result =getresultsort(array,len);

system.out.println("手動輸入陣列,使用堆排序,最終排序結果:");

for(int i = 1;i < len;i++)

system.out.println();

system.out.println();

int onearray = initarray(1000);

int len1 = 1000;

int result1 =getresultsort(onearray,len1);

system.out.println("系統隨機生成的長度為1000的陣列(其值均在0~1000之間),使用堆排序,最終排序結果:");

演算法筆記005 堆排序 變治法

用基於變治法的堆排序演算法對任意一組給定的資料進行排序 1 深刻理解並掌握變治法的設計思想 2 掌握堆的概念以及如何用變治法把任意給定的一組資料改變成堆 3 提高應用變治法設計演算法的技能。1 設計與實現堆排序演算法 2 待排序的資料可以手工輸入 通常規模比較小,10個資料左右 用以檢測程式的正確性...

變治演算法之堆排序

堆可以定義為一顆二叉樹,樹中每個節點對應乙個鍵值,並且滿足以下兩個條件 其一樹是完全二叉樹,其二是每個結點的鍵值都小於等於它的兩個子女的鍵值。有的教材說是大於,本質上是不變的 關於堆的解釋及演算法推導這裡不做解釋,可以參考 對於調整處序號為k的調整演算法,稱之為篩選演算法,通過篩選演算法,可以將任意...

《演算法導論》學習筆記(1) 堆與堆排序

堆排序 heapsort 是指利用 堆 這種資料結構 所設計的一種排序演算法 堆是一種資料結構,是乙個陣列。它可以被看成乙個近似的完全二叉樹,樹上的每乙個結點對應陣列中的乙個元素。除了最底層外,即葉子結點,該樹是完全充滿的,而且是從左到右填充。最大堆的每個結點都要滿足堆的性質,此外還有其他的約束 堆...