排序演算法之堆排序演算法的實現

2021-08-30 08:44:13 字數 1490 閱讀 1981

堆排序:利用堆資料結構而設計的一種排序演算法,堆排序是一種選擇排序,它的最壞,最好,平均時間複雜度均為o(nlogn),它也是不穩定排序。首先簡單了解下堆結構。堆是具有以下性質的完全二叉樹:每個結點的值都大於或等於其左右孩子結點的值,稱為大頂堆;或者每個結點的值都小於或等於其左右孩子結點的值,稱為小頂堆

該陣列從邏輯上講就是乙個堆結構,用簡單公式來描述一下堆的定義就是:

大頂堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]

小頂堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2]

堆排序思想及步驟:

基本思想:

將待排序序列構造成乙個大頂堆,此時,整個序列的最大值就是堆頂的根節點。將其與末尾元素進行交換,此時末尾就為最大值。然後將剩餘n-1個元素重新構造成乙個大頂堆,這樣會得到n個元素的次小值。如此反覆執行,便能得到乙個有序序列了

步驟:

a.將無需序列構建成乙個堆,根據公升序降序需求選擇大頂堆或小頂堆;

b.將堆頂元素與末尾元素交換,將最大元素"沉"到陣列末端;

c.重新調整結構,使其滿足堆定義,然後繼續交換堆頂元素與當前末尾元素,反覆執行調整+交換步驟,直到整個序列有序。

**實現:

public class heapsort implements sortableinte***ce 

//將當前堆的根節點與最後乙個葉子節點交換

swap(array , 0 , length -1);

}for(int i = 0 ; i < array.length ; i++)

system.out.print(array[i] + " ");

} //調整當前節點及其子節點的位置

public void adjustheap(int array , int i , int length)

}else if(2 * i + 1 < length)

}}

//查詢最大的節點位置

public int findmax(int array , int...indexs)

}return index;

} //交換陣列中的兩個元素

public void swap(int array , int index1 , int index2)

}

**部分全由筆者實現。

排序演算法 之堆排序的實現

includeusing namespace std 1 找到第乙個非葉子節點的位置cur 陣列元素個數size 2 1 2 從cur開始,依次將各子樹調整為最大堆 整體成為最大堆 3 堆頂元素與陣列最後乙個元素交換 4 陣列元素減1,重複執行上述操作 void adjustup int arr,i...

演算法 排序演算法之堆排序

package sortarith 堆排序 構建最大堆,堆頂即為最大元素,每次取出最大元素後,再重新構建堆,這樣再拿出次大值,迴圈往返 注意 構建堆時需要調整每個非葉子節點,確定其為子堆的最大值 而調整堆時,只需要調整堆頂元素 特例1 若所給待排序陣列array本身已是最大堆型別,可不進行構建堆,即...

演算法 排序演算法之堆排序

堆排序 heapsort 是指利用堆這種資料結構所設計的一種排序演算法。堆積是乙個近似完全二叉樹的結構,並同時滿足堆積的性質 即子結點的鍵值或索引總是小於 或者大於 它的父節點。堆排序可以說是一種利用堆的概念來排序的選擇排序。分為兩種方法 大頂堆 每個節點的值都大於或等於其子節點的值,在堆排序演算法...