基本演算法 堆排序 Java實現

2021-07-09 02:59:22 字數 1421 閱讀 6599

堆排序就是將序列調整為指定的堆,然後調整首尾元素的位置,取出末尾元素,反覆進行,直到將所有元素取出,形成乙個有序的序列。假設存在n個元素的序列

,其中父節點值不大於子節點值的堆稱為小根堆(r

i≤r2

i+1且

ri≤r

2i+2

) ,父節點的值不小於子節點的堆稱為大根堆(r

i≥r2

i+1且

存在乙個序列,按照從小到大的順序進行排序。

①將無序序列構造成乙個堆。

②取出子節點中6和8較大的值,與父節點5進行比較,比父節點5大,則交換位置。

③取出子節點中8和9較大的值,與根節點7進行比較,比跟節點7大,則交換位置,此時序列已調整為大根堆。

④將節點9和5調換位置,同時取出節點9,然後按照相同的方式將序列轉換為大根堆,取出序列中最大的數,重複操作直到序列中所有數取出完畢,生成乙個新的有序序列。

存在乙個序列n由小到大進行排序,將序列轉換為大根堆,交換首尾元素的位置,再將子串行n-1轉換為大根堆,交換收尾元素位置,反覆進行,當子串行剩餘乙個元素時,此時的序列為乙個有序序列。

public class heapsort ;

heapsort.sort(array);

system.out.println("排序後陣列:" + arrays.tostring(array));

}public static void sort(int a)

// 進行n-1次迴圈完成排序

for (int i = a.length - 1; i > 0; i--)

}// 將陣列轉換為大根堆,大根堆的根節點為陣列中的最大值

public static void adjustheap(int a, int parent, int length)

// 當父節點的值直接大於子節點的值時,直接退出

if (temp > a[child])

break;

// 將子節點的值賦值給父節點

a[parent] = a[child];

// 選取子節點的左子節點繼續向下篩選

parent = child;

child = 2 * parent + 1;

}// 若發生交換,此時parent代表子節點索引,沒有發生交換,此時parent仍舊代表父節點索引

a[parent] = temp;}}

時間複雜度:堆排序的時間複雜度為o(

nlog

2n) 。

演算法穩定性:排序前後相同元素間的相對位置可能會發生改變,堆排序是一種不穩定的排序演算法。

堆排序演算法(java實現)

public class heapsort 左孩子編號 public static int leftchild int i 右孩子編號 public static int rightchild int i 保持最大堆的性質 param a,堆中的陣列元素 param i,對以該元素為根元素的堆進行調...

Java實現堆排序演算法

這是第乙個 之前只知道如何建堆,不知道演算法導論上還有如此巧妙的堆調整演算法。所以一開始自己寫的堆排序演算法非常低效,事件複雜度為o n 2 因為每次排序都是重建堆。但是,自己寫的程式還是有自己獨特的思想的,依然要分享出來給大家看看,尤其是確定陣列表示的樹的首個葉子節點的位置的方法。以下為 pack...

java實現堆排序演算法

堆排序相對簡單的冒泡演算法快就快在它利用了每一次排序,將結果儲存下來。堆結構是一顆完全二叉樹,即除了最後一層其他層的每個結點都包含兩個子結點,我們知道擁有子節點的元素腳標是0至n 2 1,我們從n 2 1開始向上構建大頂堆結構,每乙個父親結點的值都大於孩子結點,先取得左結點l和右結點r,比較結點大小...