一、【实验目的】
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种排序算法(含两种先进排序算法),在无序状态下进行多次运行,记录运行时间,并比较测试结果。
提示:在程序的实现过程中要用到以下函数,请大家在实验之前自学这几个函数的用法:
1)随机函数rand()
2)时间函数clock()
3)随机数种子函数srand( )
三、【实验源代码】
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define RANDNUM 15000 //随机数的个数
void QuickSort(int *arr, int low, int high)
{
int i = low;
int j = high;
int k = arr[low];
if(low>high)
return;
while (i < j)
{
while(i < j && arr[j] >= k) // 从右向左找第一个小于k的数
j--;
if(i < j)
arr[i++] = arr[j];
while(i < j && arr[i] < k) // 从左向右找第一个大于等于k的数
i++;
if(i < j)
arr[j--] = arr[i];
}
arr[i] = k;
// 递归调用
QuickSort(arr, low, i - 1); // 排序k左边
QuickSort(arr, i + 1, high); // 排序k右边
}
void shellSort(int *a, int len)
{
int i, j, k, tmp, gap; // gap 为步长
for (gap = len / 2; gap > 0; gap /= 2)
{ // 步长初始化为数组长度的一半,每次遍历后步长减半,
for (i = 0; i < gap; ++i)
{ // 变量 i 为每次分组的第一个元素下标
for (j = i + gap; j < len; j += gap)
{ //对步长为gap的元素进行直插排序,当gap为1时,就是直插排序
tmp = a[j]; // 备份a[j]的值
k = j - gap; // j初始化为i的前一个元素(与i相差gap长度)
while (k >= 0 && a[k] > tmp)
{
a[k + gap] = a[k]; // 将在a[i]前且比tmp的值大的元素向后移动一位
k -= gap;
}
a[k + gap] = tmp;
}
}
}
}
void main()
{
int iRandNum[RANDNUM];//存放随机数
clock_t first,second; //记录开始和结束时间(以毫秒为单位)
double t;
int temp,a[RANDNUM],b[RANDNUM];
int i,j,index;
for(i=0;i<RANDNUM;i++)
{//产生1万个随机数
iRandNum[i]=rand()%10000;
}
for(i=0;i<RANDNUM;i++)
{
a[RANDNUM]=iRandNum[RANDNUM];
b[RANDNUM]=iRandNum[RANDNUM];
}
printf("初始序列前20个数为:\n");
for(i=0;i<20;i++)
{
printf("%d ",iRandNum[i]);
if(i%5==0&&i>0)
printf("\n");
}
printf("\n");
first=clock(); //开始时间
//此处加入排序程序
i=0;
while(i<5)
{
QuickSort(iRandNum, 0, RANDNUM-1);//快速排序
i++;
}
second=clock();//结束时间
//显示排序算法所用的时间
t=(double)(second-first)/CLK_TCK;
printf("快速排序%lf seconds",t);
printf("\n");
first=clock();
i=0;
while(i<15){
shellSort(a, RANDNUM);
i++;
}
second=clock();
t=(double)(second-first)/CLK_TCK;
printf("希尔排序 %lf seconds",t);
printf("\n");
first=clock();
for(i=0;i<RANDNUM-1;i++)
{
index=i;
for(j=i+1;j<RANDNUM;j++)
{
if(b[j]<b[index])
index=j;
}
temp=b[index];
b[index]=b[i];
b[i]=temp;
}
second=clock();
t=(double)(second-first)/CLK_TCK;
printf("选择排序 %lf seconds",t);
}