课程设计的组成部分
随机生成n个整型数据,比较冒泡排序、直接插入排序、希尔排序、快速排序、简单选择排序、堆排序和归并排序的时间性能。
要求:
1.n=5000,20000,80000,100000;
2.绘制时间性能的比较图;
3.撰写课程设计报告;
提交课程设计报告的电子版。
1.冒泡排序
#include "stdio.h"
#include "time.h"
#define N 100000
void BubbleSort(int a[],int n)
{
int i,j,t;
for(i=0;i<n-1;i++)
for(j=n-1;j>i;j--)
if(a[j]<a[j-1])
{
t=a[j];
a[j]=a[j-1];
a[j-1]=t;
}
}
main()
{
int data[N],a[N],b[N],i;
clock_t start,end;
srand((unsigned)time(0));//设置随机生成函数的种子
printf("排序前:\n");
for(i=0;i<N;i++)
{
data[i]=rand()%(N*10)+1;//生成1-100之间的随机数
a[i]=data[i];
printf("%d ",a[i]);
}
printf("\n排序后:\n");
start=clock();
BubbleSort(a,N);
end=clock();
for(i=0;i<N;i++)
{
printf("%d ",a[i]);
}
printf("\n");
printf("冒泡排序n=%d所需时间%.2f毫秒\n",N,(double)end-start);
}
2.插入排序
#include "stdio.h"
#include "time.h"
#include"stdlib.h"
#define N 10
void InSertSort(int a[],int n)
{
int i,j,t;
for(i=1;i<n;i++)
{
if(a[i]<a[i-1])
{
t=a[i];
j=i-1;
do
{
a[j+1]=a[j];
j--;
}while(j>=0&&a[j]>t);
a[j+1]=t;
}
}
}
main()
{
int data[N],a[N],b[N],i;
clock_t start,end;
srand((unsigned)time(0));//设置随机生成函数的种子
printf("排序前:\n");
for(i=0;i<N;i++)
{
data[i]=rand()%(N*10)+1;//生成1-100之间的随机数
a[i]=data[i];
printf("%d ",a[i]);
}
printf("\n排序后:\n");
start=clock();
InSertSort(a,N);
end=clock();
for(i=0;i<N;i++)
{
printf("%d ",a[i]);
}
printf("\n");
printf("插入排序n=%d所需时间%.2f毫秒\n",N,(double)end-start);
}
3.堆排序
#include "stdio.h"
#include "time.h"
#include"stdlib.h"
#define N 10
void sift(int a[],int low,int high)
{
int i=low,j=2*i;
int tmp=a[i];
while(j<=high)
{
if(j<high&&a[j]<a[j+1])
j++;
if(tmp<a[j])
{
a[i]=a[j];
i=j;
j=2*i;
}
else break;
}
a[i]=tmp;
}
void swap(int *pa,int *pb)
{
int tmp;
tmp=*pa,*pa=*pb,*pb=tmp;
}
void HeapSort(int a[],int n)
{
int i;
for(i=n/2;i>=0;i--)
sift(a,i,n);
for(i=n;i>=1;i--)
{
swap(&a[0],&a[i]);
sift(a,0,i-1);
}
}
main()
{
int data[N],a[N],b[N],i;
clock_t start,end;
srand((unsigned)time(0));//设置随机生成函数的种子
printf("排序前:\n");
for(i=0;i<N;i++)
{
data[i]=rand()%(N*10)+1;//生成1-100之间的随机数
a[i]=data[i];
printf("%d ",a[i]);
}
printf("\n排序后:\n");
start=clock();
HeapSort(a,N);
end=clock();
for(i=0;i<N;i++)
{
printf("%d ",a[i]);
}
printf("\n");
printf("堆排序n=%d所需时间%.2f毫秒\n",N,(double)end-start);
}
4.归并排序
#include<stdio.h>
#include<time.h>
#define N 100000
#define max 1000
void merge(int a[],int p,int x,int q,int b[]){
int i = p, r = x + 1, k=p;
while(i<=x || r <= q){
if((r > q)||(i <= x &&a[i] <= a[r])){
b[k++] = a[i++];
}else{
b[k++] = a[r++];
}
}
int j;
//将B数组重新放入A数组
for(j = p;j <=q;j++)
a[j] = b[j];
}
void mergeSort(int a[],int p,int q,int b[]){
if(p<q){
//将数组平均分为两段
int x=(q + p)/2;
//递归
mergeSort(a,p,x,b);
mergeSort(a,x+1,q,b);
merge(a,p,x,q,b);
}
}
int main(){
srand((unsigned int)time(NULL));
int i;
int start,end;
int a[N],b[N];
printf("随机产生的N个随机数为:\n");
for(i = 0; i< N; i++){
a[i] = rand()%max+1;
printf("%d ",a[i]);
}
start=clock();
mergeSort(a,0,N,b);
end=clock();
for(i = 0; i< N; i++){
printf("%d ",a[i]);
}
printf("\n");
printf("归并排序n=%d所需时间%.2f毫秒\n",N,(double)end-start);
return 0;
}
5.简单选择排序
#include "stdio.h"
#include "time.h"
#include"stdlib.h"
#define N 100000
void swap(int *pa,int *pb)
{
int tmp;
tmp=*pa,*pa=*pb,*pb=tmp;
}
void SelectSort(int a[],int n)
{
int i,j,k;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(a[j]<a[k])
{
k=j;
}
if(k!=i)
{
swap(&a[i],&a[k]);
}
}
}
main()
{
int data[N],a[N],b[N],i;
clock_t start,end;
srand((unsigned)time(0));//设置随机生成函数的种子
printf("排序前:\n");
for(i=0;i<N;i++)
{
data[i]=rand()%(N*10)+1;//生成1-100之间的随机数
a[i]=data[i];
printf("%d ",a[i]);
}
printf("\n排序后:\n");
start=clock();
SelectSort(a,N);
end=clock();
for(i=0;i<N;i++)
{
printf("%d ",a[i]);
}
printf("\n");
printf("简单选择排序n=%d所需时间%.2f毫秒\n",N,(double)end-start);
}
6.快速排序
#include<stdio.h>
#include<time.h> //产生随机数时时钟做种子
#include<stdlib.h>
#define MaxSize 50
#define N 100000
typedef struct
{
int key; //记录关键字
}RecordType;
int QKPass(RecordType r[], int left, int right) //一趟快速排序算法
{
int low = left;
int high = right;
r[0] = r[left];
while (low < high)
{
while (low<high && r[high].key>r[0].key)
{
high--;
}
if (low < high)
{
r[low] = r[high];
low++;
}
while (low < high && r[low].key < r[0].key)
{
low++;
}
if (low < high)
{
r[high] = r[low];
high--;
}
}
r[low] = r[0];
return low; //返回基准记录的位置
}
void QKSort(RecordType r[], int low, int high) //快速排序
{
if (low < high)
{
int pos = QKPass(r, low, high); //调用一趟快速排序,以枢轴元素为界划分两个子区间
QKSort(r, low, pos - 1); //对左部子表进行快速排序
QKSort(r, pos + 1, high); //对右部子表进行快速排序
}
}
void ShowResult(RecordType* r, int length) //输出结果
{
for (int i = 1; i <= length; i++)
{
printf("%d\t", r[i]);
if (i % 10 == 0)
{
printf("\n");
}
}
}
void RandNum(RecordType r[MaxSize])
{
srand((unsigned)time(NULL)); //初始化随机数
for (int i = 1; i <= N; i++)
{
r[i].key = rand() % 1000 + 1; //产生1-100之间的随机数
printf("%d\t", r[i]);
if (i % 10 == 0) //每行输出10个数
{
printf("\n");
}
}
}
int main()
{
int n, m,start,end;
RecordType r[31] ;
printf("产生的随机待排序列为:\n");
RandNum(r);
start=clock();
QKSort(r, 1, 100);
printf("排序结果为:\n");
ShowResult(r, 100);
}
7.希尔排序
#include "stdio.h"
#include "time.h"
#include"stdlib.h"
#define N 100000
void ShellSort(int a[],int n)
{
int i,j,d;
int t;
d=n/2;
while(d>0)
{
for(i=d;i<n;i++)
{
t=a[i];
j=i-d;
while(j>=0&&t<a[j])
{
a[j+d]=a[j];
j=j-d;
}
a[j+d]=t;
}
d=d/2;
}
}
main()
{
int data[N],a[N],b[N],i;
clock_t start,end;
srand((unsigned)time(0));//设置随机生成函数的种子
printf("排序前:\n");
for(i=0;i<N;i++)
{
data[i]=rand()%(N*10)+1;//生成1-100之间的随机数
a[i]=data[i];
printf("%d ",a[i]);
}
printf("\n排序后:\n");
start=clock();
ShellSort(a,N);
end=clock();
for(i=0;i<N;i++)
{
printf("%d ",a[i]);
}
printf("\n");
printf("希尔排序n=%d所需时间%.2f毫秒\n",N,(double)end-start);
}
排序性能比较如图
如图,相比较之下,快速排序相对其他算法,所用的时间短。