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