課程設計的組成部分
隨機生成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);
}
排序性能比較如圖
如圖,相比較之下,快速排序相對其他算法,所用的時間短。