一、【实验目的】
1、掌握插入排序算法和交换排序算法
2、掌握各种排序算法的优劣
二、【实验内容】
(1)以下是一个通过随机数来测试排序算法运行时间的程序,中间留出了加入排序算法的部分。其中可以通过修改RANDNUM的值来更改测试的数据量:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define RANDNUM 10000 //随机数的个数
void main()
{
int iRandNum[RANDNUM];//存放随机数
clock_t first,second; //记录开始和结束时间(以毫秒为单位)
int i;
for(i=0;i<RANDNUM;i++)
{//产生1万个随机数
iRandNum[i]=rand()%RANDNUM;
}
first=clock(); //开始时间
//此处加入排序程序
second=clock();//结束时间
//显示排序算法所用的时间
}
(2) 从选择、交换、插入排序算法中任选至少3种排序算法(含两种先进排序算法),在无序状态下进行多次运行,记录运行时间,并比较测试结果。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include<malloc.h>
#define RANDNUM 10000 //随机数的个数
typedef struct{
int key;
}element;
void merge(element a[],element swap[],int k,int n)//归并
{
int i,j,l1,u1,l2,u2,m;
l1=0;
m=0;
while(l1+k<=n-1)
{
l2=l1+k;
u1=l2-1;
u2=(l2+k-1<=n-1)?l2+k-1:n-1;
for(i=l1,j=l2;i<=u1&&j<=u2;m++)
{
if(a[i].key<a[j].key)
{
swap[m]=a[i];
i++;
}
else
{
swap[m]=a[j];
j++;
}
}
while(i<u1)
{
swap[m]=a[i];
m++;
i++;
}
while(j<=u2)
{
swap[m]=a[j];
m++;
j++;
}
l1=u2+1;
}
for(i=l1;i<n;i++,m++)
swap[m]=a[i];
}
void mergesort(element a[],int n)
{
int i,k =1;
element *swap;
swap=(element*)malloc(sizeof(element)*n);
while(k<n)
{
merge(a,swap,k,n);
for(i=0;i<n;i++)
a[i]=swap[i];
k=k*2;
}
free(swap);
}
void shellsort(int* arr, int n)//希尔
{
int gap = n;
while (gap>1)
{
//每次对gap折半操作
gap = gap / 2;
//单趟排序
int i;
for (i = 0; i < n - gap; ++i)
{
int end = i;
int tem = arr[end + gap];
while (end >= 0)
{
if (tem < arr[end])
{
arr[end + gap] = arr[end];
end -= gap;
}
else
{
break;
}
}
arr[end + gap] = tem;
}
}
}
void maopao(element a[],int n)//冒泡排序
{
int i,j,tag=1;
element temp;
for(i=1;i<n&&tag==1;i++)
{
tag=0;
for(j=0;j<n-1;j++)
{
if(a[j].key>a[j+1].key)
{
tag=1;
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
}
void kuaisu(element a[],int low,int high)//快速排序
{
int i,j;
element temp;
i=low;
j=high;
temp=a[low];
while(i<j)
{
while(i<j&&temp.key<=a[j].key)
j--;
if(i<j)
{
a[i]=a[j];
i++;
}
while(i<j&&a[i].key<temp.key) i++;
if(i<j)
{
a[j]=a[i];
j--;
}
}
a[i]=temp;
if(low<i) kuaisu(a,low,i-1);
if(i<high) kuaisu(a,j+1,high);
}
int main(void)
{
element iRandNum[RANDNUM];//存放随机数
clock_t first,second; //记录开始和结束时间(以毫秒为单位)
srand(time(0));
int i;
double t=0;
for(i=0;i<RANDNUM;i++)
{
iRandNum[i].key=rand()%RANDNUM;//产生1万个随机数
}
for(i=0;i<20;i++)
{
printf("%d ",iRandNum[i]);
}
printf("\n");
first=clock(); //开始时间
maopao(iRandNum,10000);
second=clock();//结束时间
t=(double)(second-first) / CLOCKS_PER_SEC;
printf("mao pao :%f seconds\n",t);
first=clock(); //开始时间
kuaisu(iRandNum,0,10000);
second=clock();//结束时间
t=(double)(second-first) / CLOCKS_PER_SEC;
printf("kuaisu :%f seconds\n",t);
first=clock(); //开始时间
mergesort(iRandNum,10000);
second=clock();//结束时间
t=(double)(second-first) / CLOCKS_PER_SEC;
printf("mergesort :%f seconds\n",t);
return 0;
}