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

2021-07-25 06:22:04 字數 2166 閱讀 1388



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

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 解決方案2.1 堆排序原理簡介 2.2 變治法原理簡介 2.3 具體編碼 2.4 執行結果截圖 用基於變治法的堆排序演算法對任意一組給定的資料進行排序 1 深刻理解並掌握變治法的設計思想 2 掌握堆的概念以及如何用變治法把任意給定的一組資料改變成堆 3 提高應用變治法設計演算法的...

變治演算法之堆排序

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

演算法 堆排序(堆)

使用情形 插入乙個數 求集合當中的最小值 刪除最小值 刪除任意乙個元素 修改任意乙個元素 用一維陣列儲存二叉樹,左兒子在陣列中為根節點在陣列中的位置的2倍,右兒子在陣列中為根節點在陣列中的位置的二倍加一。求當前堆的最小值 void down int u 輸入乙個長度為n的整數數列,從小到大輸出前m小...