堆排序問題

2022-06-20 21:12:09 字數 1841 閱讀 7777

給出乙個記錄序列,用堆排序的方法將其進行公升序排列,輸出結果,輸出時要求有文字說明。

請任選一種語言編寫程式實現上述演算法,並分析其演算法複雜度

堆排序

​ 堆排序是利用這種資料結構而設計的一種排序演算法,堆排序是一種選擇排序,它的最壞,最好,平均時間複雜度均為o(nlogn),它也是不穩定排序。首先簡單了解下堆結構。

堆是具有以下性質的完全二叉樹:每個結點的值都大於或等於其左右孩子結點的值,稱為大頂堆;或者每個結點的值都小於或等於其左右孩子結點的值,稱為小頂堆。如下圖:

大頂堆就是每個結點的值都是大於或者等於它的左右孩子結點的值

小頂堆的每個結點的值都小於或者等於其左右孩子結點的值

接下來我們通過乙個例項來了解大頂堆排序的過程:

首先我們先要進行堆的調整,從最後乙個非葉子結點開始,從左至右,從下至上進行調整。

通過依次比較孩子結點與其父結點的大小,進行不斷的調整,如果孩子

結點的值大於父結點的值,那麼就將孩子結點的值與父結點的值進行交換。直到構造成大頂堆為止。

然後我們就需要對堆進行公升序排序。

我們首先要進行的是交換末尾元素與堆頂元素,不斷的將最大的結點值交換的末尾,每次進行交換的時候,堆可能會出現混亂,此時我們就需要重新調整堆結構,使其繼續滿足堆定義。

經過不斷的調整後,我們將調整好的堆放入陣列中01

2345

1218

2028

3235

就得到了乙個公升序排序的序列

**如下:

public class experimentseven ;

system.out.println("排序前:");

system.out.println(arrays.tostring(arr));

sort(arr);

system.out.println("排序後:");

system.out.println(arrays.tostring(arr));

}public static void sort(int arr)

//2.調整堆結構+交換堆頂元素與末尾元素

for(int j=arr.length-1;j>0;j--)

}/**

* 調整大頂堆(僅是調整過程,建立在大頂堆已構建的基礎上)

* @param arr

* @param i

* @param length

*/public static void adjustheap(int arr,int i,int length)else

}arr[i] = temp;//將temp值放到最終的位置

}/**

* 交換元素

* @param arr

* @param a

* @param b

*/public static void swap(int arr,int a ,int b)

}

排序問題 堆排序

堆排序是基於優先佇列 使用基於陣列的大頂堆或者小頂堆 的排序,是乙個 建堆 刪除 調整 刪除 調整 的過程。在 個元素組成的二叉堆中,建堆的時間複雜度是o n 之後執行n次刪除堆頂元素和調整 時間複雜度為o logn 將每次刪除的元素一次放入乙個序列中便得到了乙個有序數列,時間複雜度為o n o n...

堆排序問題

堆,本質上是乙個完全二叉樹,可以用陣列來表示,這樣非常的方便。最大堆 從陣列的第一號開始排,a 0 為空,方便計算。那麼ai a2i ai a 2i 1 那麼就是最大堆 最小堆 從陣列的第一號開始排,a 0 為空,方便計算。那麼ai a2i ai a 2i 1 那麼就是最小堆。ifndef dui ...

堆排序(解決排序問題)

我之前的文章解析過排序的幾種方法,這次的堆排序原理很好理解,但 的實現並不簡單,我覺得不適合入門。堆排序的實現實際上是把根節點提取出來,不管是最大堆還是最小堆,根節點永遠是極值。乙個交換函式 在 中實現交換。向下調整函式 它的作用是調整函式使它符合堆的特點。乙個建立堆的函式 刪除函式 每次刪除極值。...