直接插入排序、折半插入排序、希尔排序、冒泡排序、选择排序、快排、堆排序、归并排序算法效率比较

1 篇文章 0 订阅

这里建议使用三万左右的随机数个数进行比较。

这里比较的算法有直接插入排序,折半插入排序,希尔排序,冒泡排序,选择排序,快排,堆排序,归并排序。

#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("请输入您需要选择的操作:");
	}
}

 

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值