希爾排序耗時程式碼
阿新 • • 發佈:2019-01-04
折半排序,插入排序,希爾排序。c++
排序函式所用時間的比較,十萬個隨機數進行排序所耗時(一百萬個隨機數,我的電腦顯示不出來)
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <time.h> using namespace std; #define MAXSIZE 1000000 //順序表的最大長度 typedef struct { int key; char *otherinfo; }ElemType; //順序表的儲存結構 typedef struct { ElemType *r; //儲存空間的基地址 int length; //順序表長度 }SqList; //順序表型別 //插入排序 void InsertSort(SqList &L) { //對順序表L做直接插入排序 int i,j; for(i=2;i<=L.length;++i) if(L.r[i].key<L.r[i-1].key) { //"<",需將r[i]插入有序子表 L.r[0]=L.r[i]; //將待插入的記錄暫存到監視哨中 L.r[i]=L.r[i-1]; //r[i-1]後移 for(j=i-2; L.r[0].key<L.r[j].key;--j) //從後向前尋找插入位置 L.r[j+1]=L.r[j]; //記錄逐個後移,直到找到插入位置 L.r[j+1]=L.r[0]; //將r[0]即原r[i],插入到正確位置 } //if } //InsertSort //折半排序 void SInsertSort(SqList &L) { int i,j,low,high,m; for(i=2;i<=L.length;++i) { L.r[0]=L.r[i]; low=1;high=i-1; while(low<=high) { m=(low+high)/2; if(L.r[0].key<L.r[m].key) high=m-1; else low=m+1; } for(j=i-1;j>high+1;--j) L.r[j+1]=L.r[j]; L.r[high+1]=L.r[0]; } } //希爾排序 void ShellInsert(SqList &L, int dk) { int i,j; for(i=dk+1;i<=L.length;++i) if(L.r[i].key<L.r[i-dk].key) { L.r[0]=L.r[i]; for(j=i-dk;j>0&& L.r[0].key<L.r[j].key;j-=dk) L.r[j+dk]=L.r[j]; L.r[j+dk]=L.r[0]; } } void ShellSort(SqList &L,int dt[],int t) { int k; for(k=0;k<t;++k) ShellInsert(L,dt[k]); } int main() { SqList L; //L = new Sqlist[]; L.r = new ElemType[MAXSIZE+1]; //L = new ElemType[MAXSIZE+1]; //L.r = new ElemType[MAXSIZE]; //L =new SqList[n+1]; //ElemType t; int n,i,m; clock_t begin,end; //定義時間開始變數 printf("請輸入元素個數:\n"); scanf("%d",&n); L.length=n; for(i=1 ;i<=n ;i++) {//生成n個隨機 m=rand(); // printf("%d ",m); //列印這n個隨機數 L.r[i].key=m; } begin=clock();//函式開始時間 InsertSort(L); end=clock();//函式結束時間 /*for(i=1;i<=n;i++) {//列印排序後的這n個數 cout<<L.r[i].key<<endl; }*/ printf("插入排序 耗時:%lf s\n",(double)(end-begin)/CLOCKS_PER_SEC);//總時間 begin=clock(); SInsertSort(L); end=clock(); /*for(i=1;i<=n;i++) { cout<<L.r[i].key<<endl; }*/ printf("折半排序 耗時:%lf s\n",(double)(end-begin)/CLOCKS_PER_SEC); int dt[]={5,3,1},t=3; begin=clock(); ShellSort(L,dt,t); end=clock(); /*for(i=1;i<=n;i++) { cout<<L.r[i].key<<endl; }*/ printf("希爾排序 耗時:%lf s\n",(double)(end-begin)/CLOCKS_PER_SEC); return 0; }
如果程式碼不對,還請原諒!