堆排序就是將序列調整為指定的堆,然後調整首尾元素的位置,取出末尾元素,反覆進行,直到將所有元素取出,形成乙個有序的序列。假設存在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,比較結點大小...