這裏建議使用三萬左右的隨機數個數進行比較。
這裏比較的算法有直接插入排序,折半插入排序,希爾排序,冒泡排序,選擇排序,快排,堆排序,歸併排序。
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<math.h>
#define MAXSIZE 100001
typedef struct {
int key;
}Rectype;
void stInsertSort(Rectype r[],int n){//直接插入排序
for(int i=2;i<n;i++){
r[0]=r[i];
int j;
for(j=i-1;r[0].key<r[j].key;j--)
r[j+1].key=r[j].key;
r[j+1]=r[0];
}
}
void binInsertSort(Rectype r[],int n){//折半插入排序
int i,j,low,mid,high;
for(i=1;i<n;i++){
r[0]=r[i];
low=1;
high=i-1;
while(low<=high){
mid=(low+high)/2;
if(r[i].key>r[mid].key)
low=mid+1;
else
high=mid-1;
}
for(j=i-1;j>=high+1;j--)
r[j+1]=r[j];
r[high+1]=r[0];
}
}
void ShellInsert(Rectype array[],int dk,int n){//希爾排序
int i,j,temp;
for(i=dk;i<n;i++){
temp=array[i].key;
for(j=i-dk;(j>=i%dk)&&array[j].key>temp;j-=dk)
array[j+dk]=array[j];
if(j!=i-dk)
array[j+dk].key=temp;
}
}
int dkHibbard(int t,int k){
return (int)(pow(2,t-k+1)-1);
}
void ShellSort(Rectype array[],int t,int n){
int i;
for(i=1;i<=t;i++)
ShellInsert(array,dkHibbard(t,i),n);
}
void BubbleSort(Rectype r[],int n){//冒泡排序
int i,j,flag;
for(i=2;i<n;i++){
flag=0;
for(j=1;j<=n-i;j++){
if(r[j].key>r[j+1].key){
r[0]=r[j+1];
r[j+1]=r[j];
r[j]=r[0];
flag=1;
}
}
if(flag==0)
break;
}
}
void SelectSort(Rectype r[],int n){//選擇排序
int i,j,min;
for(i=1;i<n-1;i++){
min=i;
for(j=i+1;j<n;j++)
if(r[j].key<r[min].key) min=j;
if(min!=i){
r[0]=r[i];
r[i]=r[min];
r[min]=r[0];
}
}
}
void QuickSort(Rectype r[], int left, int right){//快速排序
if(left >= right)
return;
int i=left;
int j=right;
r[0]=r[left];
while(i<j){
while(i<j&&r[j].key>=r[0].key){
j--;
}
if(i<j){
r[i]=r[j];
i++;
}
while(i<j&&r[i].key<=r[0].key){
i++;
}
if(i<j){
r[j]=r[i];
j--;
}
}
r[i]=r[0];
QuickSort(r, left, i-1);
QuickSort(r, i+1, right);
}
void HeapAdjust(Rectype r[],int k,int m){//堆排序
int i=k;
int j=2*i;
int x=r[k].key;
int finished=0;
Rectype rc=r[k];
while(j<=m&&!finished){
if(j<m&&r[j].key>r[j+1].key)j++;
if(x<r[j].key)finished=1;
else {
r[i]=r[j];
i=j;
j=2*i;
}
}
r[i]=rc;
}
void HeapSort(Rectype r[],int n){
for(int i=n/2;i>=1;i--)
HeapAdjust(r,i,n);
for(int i=n;i>=2;i--){
r[0]=r[1];
r[1]=r[i];
r[i]=r[0];
HeapAdjust(r,1,i-1);
}
}
void Merge(Rectype r[],Rectype r1[],int s,int m,int t){//歸併排序
int i=s,j=m+1,k=s;
while(i!=m+1&&j!=t+1){
if(r[i].key>r[j].key)
r1[k++]=r[j++];
else
r1[k++]=r[i++];
}
while(i!=m+1)
r1[k++]=r[i++];
while(j!=t+1)
r1[k++]=r[j++];
for(i=s;i<=t;i++)
r[i]=r1[i];
}
void MergeSort(Rectype r[],Rectype r1[],int s,int t){
int m;
if(s<t){
m=s+(t-s)/2;
MergeSort(r,r1,s,m);
MergeSort(r,r1,m+1,t);
Merge(r,r1,s,m,t);
}
}
void Menu(){
printf(" 請輸入下列數字開始操作:\n");
printf(" 1 --------------------------------- 直接選擇排序\n");
printf(" 2 --------------------------------- 拆半插入排序\n");
printf(" 3 --------------------------------- 希爾排序\n");
printf(" 4 --------------------------------- 冒泡排序\n");
printf(" 5 --------------------------------- 直接插入排序\n");
printf(" 6 --------------------------------- 快速排序\n");
printf(" 7 --------------------------------- 堆排序\n");
printf(" 8 --------------------------------- 歸併排序\n");
printf(" 9 --------------------------------- 結束操作\n\n");
}
int main(){
Rectype r[MAXSIZE],r1[MAXSIZE]={0};
int i,n,s,t=3;
int begin;
Menu();
printf("請輸入元素個數:");
scanf("%d",&n);
srand((unsigned int)time(NULL));
printf("請輸入您需要選擇的操作:");
while(scanf("%d",&s)){
begin=0;
switch(s){
case 1:
for(i=1;i<n+1;i++)
r[i].key=rand();
begin=clock();
stInsertSort(r,n+1);
printf("直接選擇排序對%d個隨機數排序的運行時間爲:%d\n",n,clock()-begin);
break;
case 2:
for(i=1;i<n+1;i++)
r[i].key=rand();
begin=clock();
binInsertSort(r,n+1);
printf("拆半插入排序對%d個隨機數排序的運行時間爲:%d\n",n,clock()-begin);
break;
case 3:
for(i=0;i<n;i++)
r[i].key=rand();
begin=clock();
ShellSort(r,t,n);
printf("希爾排序對%d個隨機數排序的運行時間爲:%d\n",n,clock()-begin);
break;
case 4:
for(i=1;i<n+1;i++)
r[i].key=rand();
begin=clock();
BubbleSort(r,n+1);
printf("冒泡排序對%d個隨機數排序的運行時間爲:%d\n",n,clock()-begin);
break;
case 5:
for(i=1;i<n+1;i++)
r[i].key=rand();
begin=clock();
SelectSort(r,n+1);
printf("直接插入排序對%d個隨機數排序的運行時間爲:%d\n",n,clock()-begin);
break;
case 6:
for(i=1;i<n+1;i++)
r[i].key=rand();
begin=clock();
QuickSort(r,1,n);
printf("快速排序對%d個隨機數排序的運行時間爲:%d\n",n,clock()-begin);
break;
case 7:
for(i=1;i<n+1;i++)
r[i].key=rand();
begin=clock();
HeapSort(r,n);
printf("堆排序對%d個隨機數排序的運行時間爲:%d\n",n,clock()-begin);
break;
case 8:
for(i=1;i<n+1;i++)
r[i].key=rand();
begin=clock();
MergeSort(r,r1,1,n);
printf("歸併排序的運行時間爲:%d\n",clock()-begin);
break;
case 9:
exit (0);
default :
printf("輸入錯誤!");
break;
}
printf("請輸入您需要選擇的操作:");
}
}