演算法篇之排序(二)

2021-06-26 16:55:01 字數 1588 閱讀 7786

堆的定義:堆是乙個完全二叉樹,樹中每個結點對應於原始資料的乙個記錄,並且每個結點應滿足以下條件:非葉結點的資料大於或等於其左、右孩子結點的資料(若是按從大到小的順序排序,則要求非葉結點的資料小於或等於其左、右孩子結點的資料)。

步驟:1、構成堆

(1)將無序資料放入完全二叉樹的各結點。

(2)由二叉樹的下層向上層逐層對父子結點的資料進行比較,使用一種稱為「篩」的運算進行結點資料的調整,直到使結點最後滿足堆的條件為止。

2、利用堆排序

(1)取堆的根結點(最大值),將其放到陣列的最後。

(2)重新執行構成堆的方法,對堆進行重新構成。此時,應將最後乙個結點排除在外。

(3)重複上述過程,逐步從根結點取出最大值,放入到陣列的後面,再對剩下的結點重新構成堆,直到只剩下乙個結點,即可得到有序的資料。

原始碼:

#include #include #define arraylen 10

void heapadjust(int a, int s, int n) //構成堆

if(a[s] < a[j]) //比較s與j為序號的資料

else //不再需要調整

break; //退出迴圈

}

}void heapsort(int a, int n) //堆排序

} int main()

; //定義陣列

heapsort(a,arraylen);

printf("排序後:");

for(i = 0; i < arraylen; i++) //輸出排序後的結果

printf("%d ",a[i]);

printf("\n");

system("pause");

return 0;

}

演算法描述:

(1)對於第乙個元素,因為沒有比較,將其作為已經有序的序列。

(2)從陣列中獲取下乙個元素,在已經排序的元素序列中從後向前掃瞄,並進行判斷。

(3)若排序序列的元素大於新元素,則將該元素移到下一位置

(4)重複步驟(3),直到找到已排序的元素小於或者等於新元素的位置

(5)將新元素插入到該位置

(6)重複步驟(2)~步驟(5),直到將陣列中的資料處理完

原始碼:#include #include #define arraylen 10

void insertsort(int a, int n) //直接插入排序

{ int i,j,t;

for(i = 1; i < n; i++)

{t = a[i]; //取出乙個未排序的資料

for(j=i - 1; j >= 0 && t

演算法基礎之排序篇

排序 sorting 是計算機程式設計中的一種重要操作,它的功能是將乙個資料元素 或記錄 的任意序列,重新排列成乙個關鍵字有序的序列。排序是演算法裡面最基礎的東西,用到的地方很多,比如各種榜單,各類搜尋等。排序的方法也很多,下面一起回顧一下一些通用的排序方法。排序演算法一般考慮穩定性,平均時間複雜度...

演算法基礎之排序篇 氣泡排序

1 演算法描述依次比較相鄰的數劇,將小的數排前面,大的排後面。操作步驟 1 從第乙個元素開始,依次與後乙個數比較,小數放前,大數放後,結果是最大的放到了最後。2 對前n i個數重複 1 i從1至n 2,n為原序列大小。2 圖例 3 public void sort int data 4 穩定性及複雜...

演算法基礎之排序篇 希爾排序

1 演算法描述希爾排序是一種遞減增量排序,當增量等於1的時候,就成了插入排序,因此希爾排序的最後一步就是普通的插入排序。操作步驟 1 選擇步長di 1 di n 對待排序列進行分割。所有距離為di的資料分到乙個組。2 對每乙個組進行插入排序。3 遞減步長,重複 1 2 直到步長等於1 2 圖例 3 ...