第16周專案1 驗證演算法(6)堆排序
阿新 • • 發佈:2019-02-07
問題:
/*
* Copyright (c)2015,煙臺大學計算機與控制工程學院
* All rights reserved.
* 檔名稱:專案1-6.cbp
* 作 者:張芸嘉
* 完成日期:2015年12月18日
* 版 本 號:v1.0
* 問題描述: 驗證堆排序
* 輸入描述:無
* 程式輸出:測試資料
*/
程式碼:
#include <stdio.h> #define MaxSize 20 typedef int KeyType; //定義關鍵字型別 typedef char InfoType[10]; typedef struct //記錄型別 { KeyType key; //關鍵字項 InfoType data; //其他資料項,型別為InfoType } RecType; //排序的記錄型別定義 //調整堆 void sift(RecType R[],int low,int high) { int i=low,j=2*i; //R[j]是R[i]的左孩子 RecType temp=R[i]; while (j<=high) { if (j<high && R[j].key<R[j+1].key) //若右孩子較大,把j指向右孩子 j++; //變為2i+1 if (temp.key<R[j].key) { R[i]=R[j]; //將R[j]調整到雙親結點位置上 i=j; //修改i和j值,以便繼續向下篩選 j=2*i; } else break; //篩選結束 } R[i]=temp; //被篩選結點的值放入最終位置 } //堆排序 void HeapSort(RecType R[],int n) { int i; RecType temp; for (i=n/2; i>=1; i--) //迴圈建立初始堆 sift(R,i,n); for (i=n; i>=2; i--) //進行n-1次迴圈,完成推排序 { temp=R[1]; //將第一個元素同當前區間內R[1]對換 R[1]=R[i]; R[i]=temp; sift(R,1,i-1); //篩選R[1]結點,得到i-1個結點的堆 } } int main() { int i,n=10; RecType R[MaxSize]; KeyType a[]= {0,6,8,7,9,0,1,3,2,4,5};//a[0]空閒,不作為關鍵字 for (i=1; i<=n; i++) R[i].key=a[i]; printf("排序前:"); for (i=1; i<=n; i++) printf("%d ",R[i].key); printf("\n"); HeapSort(R,n); printf("排序後:"); for (i=1; i<=n; i++) printf("%d ",R[i].key); printf("\n"); return 0; }
執行結果:
知識點總結:
堆排序法