满意答案
rlnep
2014.11.11
采纳率:48% 等级:11
已帮助:6861人
#include
#include
#include
#include
voidBubbleSort(int*L,intN)
{//冒泡
inti,j;
intt;
for(i=1;i<=N;i++)
{
for(j=N;j>i;j--)
if(L[j]
{
t=L[j];
L[j]=L[j-1];
L[j-1]=t;
}
}
}
intSelectMinKey(int*L,intN,intn)
{
inti,min=n;
for(i=n+1;i<=N;i++)
if(L[i]
min=i;
returnmin;
}
voidSelectSort(int*L,intN)
{//选择
inti,j;
intt;
for(i=1;i
{
j=SelectMinKey(L,N,i);
if(i!=j)
{
t=L[i];
L[i]=L[j];
L[j]=t;
}
}
}
voidInsertSort(int*L,intN)
{//插入
inti,j;
for(i=2;i<=N;i++)
{
if(L[i]
{
L[0]=L[i];
L[i]=L[i-1];
for(j=i-2;L[0]
L[j+1]=L[j];
L[j+1]=L[0];
}
}
}
voidShellInsert(int*L,intN,intdk)
{//对顺序表L作一趟希尔插入排序。本算法对算法10.1作了以下修改:
//1.前后记录位置的增量是dk,而不是1;
//2.r[0]只是暂存单元,不是哨兵。当j<=0时,插入位置已找到。
inti,j;
for(i=dk+1;i<=N;++i)
if(L[i]
{//需将L.r[i]插入有序增量子表
L[0]=L[i];//暂存在L.r[0]
for(j=i-dk;(j>0&&L[0]
L[j+dk]=L[j];//记录后移,查找插入位置
L[j+dk]=L[0];//插入
}
}//ShellInsert
voidShellSt(int*L,intN,intdlta[],intt)
{//算法10.5
//按增量序列dlta[0..t-1]对顺序表L作希尔排序。
for(intk=0;k
ShellInsert(L,N,dlta[k]);//一趟增量为dlta[k]的插入排序
}//ShellSort
voidShellSort(int*L,intN)
{//希尔
intt=(int)log(N);
intk,*dlta;
dlta=(int*)malloc(t*4);//产生增量序列
for(k=0;k
dlta[k]=(int)pow(2,t-k)-1;
ShellSt(L,N,dlta,t);
}
intmain()
{
intN=250;
inti,j,k;
intt;
intti[16];
int*L;
srand(time(NULL));
printf("长度\t|冒泡\t|选择\t|插入\t|希尔\n");
printf("--------+-------------------------------------------------------------");
for(j=0;N<100000;j++)
{
L=(int*)malloc((N+1)*4);
t=0;
for(i=1;i<=N;i++)
L[i]=rand();
ti[t++]=clock();
BubbleSort(L,N);
ti[t++]=clock();
for(i=1;i<=N;i++)
L[i]=rand();
ti[t++]=clock();
SelectSort(L,N);
ti[t++]=clock();
for(i=1;i<=N;i++)
L[i]=rand();
ti[t++]=clock();
InsertSort(L,N);
ti[t++]=clock();
for(i=1;i<=N;i++)
L[i]=rand();
ti[t++]=clock();
ShellSort(L,N);
ti[t++]=clock();
printf("\n%d\t",N);
for(k=0;k<4;k++)
printf("|%d\t",(ti[2*k+1]-ti[2*k]));
N*=5;
}
printf("\n\n");
}
//这是我们当年学数据结构时我自己写的,给你改了一下,输出是对随机产生一些数,对四种算法进行比较,有问题可以hi我啊
01分享举报