排序總結 簡單選擇排序,堆排序

2021-08-22 19:04:03 字數 1212 閱讀 5639

在要排序的一組數中,選出最小(或者最大)的乙個數與第1個位置的數交換;然後在剩下的數當中再找最小(或者最大)的與第2個位置的數交換,依次類推,直到第n-1個元素(倒數第二個數)和第n個元素(最後乙個數)比較為止。

初始時把要排序的n個數的序列看作是一棵順序儲存的二叉樹(一維陣列儲存二叉樹),調整它們的儲存序,使之成為乙個堆,將堆頂元素輸出,得到n 個元素中最小(或最大)的元素,這時堆的根節點的數最小(或者最大)。然後對前面(n-1)個元素重新調整使之成為堆,輸出堆頂元素,得到n 個元素中次小(或次大)的元素。依此類推,直到只有兩個節點的堆,並對它們作交換,最後得到有n個節點的有序序列。稱這個過程為堆排序。

因此,實現堆排序需解決兩個問題:

1. 如何將n 個待排序的數建成堆;

2. 輸出堆頂元素後,怎樣調整剩餘n-1 個元素,使其成為乙個新堆。 

首先討論第二個問題:輸出堆頂元素後,對剩餘n-1元素重新建成堆的調整過程。

調整小頂堆的方法:

1)設有m 個元素的堆,輸出堆頂元素後,剩下m-1 個元素。將堆底元素送入堆頂((最後乙個元素與堆頂進行交換),堆被破壞,其原因僅是根結點不滿足堆的性質。

2)將根結點與左、右子樹中較小元素的進行交換。

3)若與左子樹交換:如果左子樹堆被破壞,即左子樹的根結點不滿足堆的性質,則重複方法 (2).

4)若與右子樹交換,如果右子樹堆被破壞,即右子樹的根結點不滿足堆的性質。則重複方法 (2).

5)繼續對不滿足堆性質的子樹進行上述交換操作,直到葉子結點,堆被建成。

稱這個自根結點到葉子結點的調整過程為篩選。如圖:

再討論對n 個元素初始建堆的過程。

建堆方法:對初始序列建堆的過程,就是乙個反覆進行篩選的過程。

1)n 個結點的完全二叉樹,則最後乙個結點是第個結點的子樹。

2)篩選從第個結點為根的子樹開始,該子樹成為堆。

3)之後向前依次對各結點為根的子樹進行篩選,使之成為堆,直到根結點。

如圖建堆初始過程:無序序列:(49,38,65,97,76,13,27,49)

選擇排序 簡單選擇排序 堆排序

一 簡單選擇排序 對於n個數要進行n次排序,第一次,將最小的數放在第乙個。第二次,將第二小的樹,放在第二個。每次都和後面的數做比較,如果是從小到大的排序,當當前的數字比後面的大時,要進行交換。include void chosesort int a,int length void main int ...

選擇排序 簡單選擇排序和堆排序

1.簡單選擇排序 1 演算法思想 將序列的第乙個元素當作最小的元素,和後面的元素一一比較,將最小的元素下標標記出來,和第乙個元素進行交換,則一趟下來,第乙個元素一定是最小的,直到所有的元素全部排序完成。2 基本實現 void selectsort datatype arr,int sz if k i...

選擇排序 簡單選擇排序和堆排序

這裡的測試資料來自於之前自己隨便寫的生成器 include using namespace std intmain int t 10,arr 20 while t return0 簡單選擇排序 void selectsort int arr,int n if min i 簡單選擇排序 空間複雜度 使...