插入排序
使用数组或链表结构。用随机函数生成 100 个整数(1~1000),分别进行直接插入排序和希尔排序(增量序列 8,4,2,1)。
重复上述实验 1,000 次,
(1)计算 1,000 次实验所得到的平均比较次数
(2)对上述两种算法的时间效率进行比较分析
比较次数验证:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 100
typedef struct{
int R[N]; //用数组存储随机数
int length; //表长
}SSTable;
int InsertSort(SSTable *L)
{//直接插入排序
int i,j,k=0;
for(i=2;i<=N;++i) //从第二个位置开始查找插入
{
k++;
if(L->R[i]<L->R[i-1]) //若后一个数小于前一个数
{
L->R[0]=L->R[i]; //复制第i位为哨兵到第零位
for(j=i-1;L->R[0]<L->R[j];--j,k++)
L->R[j+1]=L->R[j]; //后移
L->R[j+1]=L->R[0]; //插入到正确位置
}
}
return k;
}
int ShellInsert (SSTable *L,int dk)
{//希尔排序II
int i,j,k=0;
for(i=dk+1;i<=N;i++)
{
k++;
if(L->R[i]<L->R[i-dk]) //若后一个数小于前一个数
{
L->R[0]=L->R[i]; //复制第i位为哨兵到第零位
for(j=i-dk;j>0&&(L->R[0]<L->R[j]);j=j-dk,k++)
L->R[j+dk]=L->R[j]; //后移
L->R[j+dk]=L->R[0]; //插入到正确位置
}
}
return k;
}
int ShellSort(SSTable *L,int dlta[],int t)
{//希尔排序I
int i=0,j;
for(int k=0;k<t;k++)
{
j=ShellInsert(L,dlta[k]);
i=i+j;
}
return i;
}
int main()
{
srand(time(NULL));
//直接插入排序
int average=0,sum;
int i,k,j;
for(k=0;k<1000;k++)
{
printf("%d start:",k+1);
SSTable L;
for(i=1;i<=N;i++)//对L赋值
L.R[i]=rand()%(1000)+1; //生成1~1000的随机数并存入数组中
sum=InsertSort(&L); //直接插入排序
average=average+sum;
printf("\nSingle comparison times %d\n",sum);//单次比较次数
printf("InsertSort:");
for(j=1;j<=100;j++)
printf("%d ",L.R[j]);
printf("\n\n");
}
printf("\nInsertSort average:%d\n",average/1000);
//希尔排序
/*int average=0,sum;
int i,k,j;
for(k=0;k<1000;k++)
{
printf("%d start:",k+1);
SSTable P;
int dlta[4]={8,4,2,1};
for(i=1;i<=N;i++)//对L赋值
P.R[i]=rand()%(1000)+1; //生成1~1000的随机数并存入数组中
sum=ShellSort(&P,dlta,4); //希尔排序
average=average+sum;
printf("\nSingle comparison times %d\n",sum);//单次比较次数
printf("ShellSort:");
for(j=1;j<=100;j++)
printf("%d ",P.R[j]);
printf("\n\n");
}
printf("\nShellSort average:%d\n",average/1000);*/
}
时间效率验算:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void InsertSort(int L[])
{//直接插入排序
int i,j,k=0;
for(i=2;i<=100000;++i) //从第二个位置开始查找插入
{
if(L[i]<L[i-1]) //若后一个数小于前一个数
{
L[0]=L[i]; //复制第i位为哨兵到第零位
for(j=i-1;L[0]<L[j];--j)
L[j+1]=L[j]; //后移
L[j+1]=L[0]; //插入到正确位置
}
}
}
void ShellInsert (int L[],int dk)
{//希尔排序II
int i,j,k=0;
for(i=dk+1;i<=100000;i++)
{
if(L[i]<L[i-dk]) //若后一个数小于前一个数
{
L[0]=L[i]; //复制第i位为哨兵到第零位
for(j=i-dk;j>0&&(L[0]<L[j]);j=j-dk)
L[j+dk]=L[j]; //后移
L[j+dk]=L[0]; //插入到正确位置
}
}
}
void ShellSort(int L[],int dlta[],int t)
{//希尔排序I
int i=0,j;
for(int k=0;k<t;k++)
ShellInsert(L,dlta[k]);
}
/* int main()
{
srand(time(NULL));
int a[100000]; //排列一万个数
int dlta[4]={8,4,2,1};
int k,i,j;
for(i=1;i<=100000;i++)//对L赋值
a[i]=rand()%(1000)+1; //生成1~1000的随机数并存入数组中
ShellSort(a,dlta,4);
printf("Time used = %.2lf\n", (double)clock() / CLOCKS_PER_SEC); //整个程序运行的时间 单位毫秒
}
*/
int main()
{//直接插入排序时间效率
srand(time(NULL));
int a[100000]; //排列一万个数
int k,i,j;
for(i=1;i<=100000;i++)//对L赋值
a[i]=rand()%(1000)+1; //生成1~1000的随机数并存入数组中
InsertSort(a);
printf("Time used = %.2lf\n", (double)clock() / CLOCKS_PER_SEC); //程序运行的时间 单位毫秒
}