設計程式,利用隨機函式產生20000個隨機整數(1~1000000),完成下面功能:
(1)對這些數分別進行直接插入排序、折半插入排序、希爾排序、起泡排序、快速排序、簡單選擇排序、堆排序、2-路歸併排序,並把排序結果儲存到檔案中。
(2)分析上述排序演算法的效能(以執行程式所花費的時間為準進行對比),找出較快的排序方法。
(3)若排序的整數增加到100000個、100000000個,以上排序結果有什麼變化,請分析並驗證。
#include#include#include#define maxsize 20000 //順序表最大長度
using namespace std ;
typedef structredtype; //記錄型別
typedef structsqlist; //順序表型別
//直接插入排序
void insertsort(sqlist &l)
}//希爾排序 shellinsert() shellsort()
//對順序表l中的記錄進行一趟增量為dk的希爾排序
void shellinsert(sqlist &l,int dk)
--m ;
} }//快速排序 partition() qsort() quicksort()
//對順序表l中的子表l.r[low...high]進行一次劃分,並返回樞軸位置
int partition(sqlist &l,int low,int high)
l.r[s] = rc ;
}//初建堆
void creatheap(sqlist &l)
//堆排序演算法實現
void heapsort(sqlist &l) }
// 2-路歸併排序
//相鄰兩個有序子串行的歸併
void merge(redtype r,redtype t,int low,int mid,int high)
while(i<=mid)
t[k++] = r[i++] ; //將剩餘的 r[i..mid] 複製到 t 中
while(j<=high)
t[k++] = r[j++] ; //將剩餘的 r[j..high] 複製到 t 中
} //分
void msort(redtype r,redtype t,int low,int high) }
//遞迴呼叫排序
void mergesort(sqlist &l)
//建立順序表:向順序表l中新增10個記錄,記錄的關鍵字為1-100範圍內的隨機整數
void createlist(sqlist &l)
l.length =20000;
}//選單
void showmenu()
int main()
; //dt中存放的是希爾排序時使用的三個增量
showmenu() ;
printf("\n") ;
printf("測試資料量:1000\n") ;
printf("\n") ;
//將生成的隨機數讀入到 data.doc 檔案中
file * fpwrite = fopen("c:\\users\\lzy\\desktop\\data.doc","w") ;
for(int i=1;i<=l.length;i++)
fprintf(fpwrite,"%-8d ",l.r[i].key) ;
if(fpwrite!=null)
printf("初始資料讀入檔案成功\n") ;
fclose(fpwrite) ; //關閉檔案
cin>>n; //輸出選擇的排序方法序號
while(n!=0) //迴圈顯示選單,按0結束程式
return 0 ;
}
八大排序 堆排序
堆排序 利用大頂堆 小頂堆 堆頂記錄的是最大關鍵字 最小關鍵字 這一特性,使得每次從無序中選擇最大記錄 最小記錄 變得簡單。其基本思想為 大頂堆 1 將初始待排序關鍵字序列 r1,r2 rn 構建成大頂堆,此堆為初始的無須區 2 將堆頂元素r 1 與最後乙個元素r n 交換,此時得到新的無序區 r1...
八大排序 希爾排序
希爾排序 shell sort 是插入排序的一種。是直接插入排序的改進版,它是非穩定排序演算法。其得名於它的提出者d.l.shell,shell sort等演算法的提出打破了 排序演算法不可能突破o n 2 的魔咒,它將排序演算法的時間複雜度提成到了o nlogn 不可能超越的o n 2 徹底成為了...
八大排序 選擇排序
n個資料的檔案可經過n 1趟直接選擇排序得到有序結果。初始狀態 無序區 r 1.n 有序區為空。第一趟排序 在無序區r 1.n 選出下標最小的記錄r 1 通過比較獲得無序區中最小的,將他與無序區的第乙個記錄r 1 交換,使得r 1.1 和r 2.n 成為新的有序區域,和新的無序區域。第i趟排序 第i...