希爾排序耗時代碼

折半排序,插入排序,希爾排序。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;
}

十萬次
如果代碼不對,還請原諒!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章