7-12 排序 (25 分)(C语言版)

1:尝试用了七种排序:快速排序、选择排序、冒泡排序(超时)、插入排序、希尔排序、改进的希尔排序、归并排序。
2:只有冒泡排序超时,其他都能通过这道题。

给定N个(长整型范围内的)整数,要求输出从小到大排序后的结果。

本题旨在测试各种不同的排序算法在各种数据情况下的表现。各组测试数据特点如下:

数据1:只有1个元素;
数据2:11个不相同的整数,测试基本正确性;
数据3:103个随机整数;
数据4:104个随机整数;
数据5:105个随机整数;
数据6:105个顺序整数;
数据7:105个逆序整数;
数据8:105个基本有序的整数;
数据9:105个随机正整数,每个数字不超过1000。
输入格式:
输入第一行给出正整数N(≤10^5),随后一行给出N个(长整型范围内的)整数,其间以空格分隔。

输出格式:
在一行中输出从小到大排序后的结果,数字间以1个空格分隔,行末不得有多余空格。

输入样例:

11
4 981 10 -17 0 -20 29 50 8 43 -5

输出样例:

-20 -17 -5 0 4 8 10 29 43 50 981
#include<stdio.h>
int a[100001];
int b[100001];
/*快速排序*/
int partition(int a[],int i,int j)
{
	int t=a[i];
	
	while(i<j){
		while(a[j]>=t && i<j)j--;
		if(i<j)a[i++]=a[j];
		while(a[i]<=t && i<j)i++;
		if(i<j)a[j--]=a[i];	 
	}
	
	a[i]=t;
	return i;
}
void QuickSort(int a[],int i,int j)
{
	int k;
	if(i<j){
		k=partition(a,i,j);//使用划分函数把序列分成两部分 
		QuickSort(a,i,k-1);//对前半部分递归排序 
		QuickSort(a,k+1,j);//对后半部分递归排序 
	}
}

/*选择排序*/
void SelectionSort(int a[],int n)
{
	int i,j;
	int minId;//每一轮中最小值的下标 
	int t;
	
	for(i=0;i<n-1;i++){
		minId=i;
		for(j=i+1;j<n;j++){
			if(a[j]<a[minId]){
				minId=j;
			}
		}
		
		t=a[i];
		a[i]=a[minId];
		a[minId]=t;
	}
}

/*冒泡排序*/
void BubbleSort(int a[],int n)
{
	int i,j;
	int t;
	
	for(i=0;i<n-1;i++){//外层循环n-1趟 
		for(j=0;j<n-1-i;j++){//第一次比较n-1次 
			if(a[j]>a[j+1]){//相邻进行比较,逆序则进行交换 
				t=a[j];
				a[j]=a[j+1];
				a[j+1]=t;
			}
		}
	}
}

/*插入排序*/
void InsertionSort(int a[],int n)
{
	int i,j;
	int t;
	
	for(i=1;i<n;i++){
		t=a[i];
		for(j=i-1;j>=0 && t<a[j];j=j-1){
			a[j+1]=a[j];
		}
		a[j+1]=t;
	}
	
}

/*希尔排序*/
void ShellSort(int a[],int n,int delta)
{
	int i,j;
	int t;
	int g;
    
	for(i=delta;i<n;i++){
		t=a[i];
		for(j=i-delta;j>=0 && t<a[j];j=j-delta){
			a[j+delta]=a[j];
		}
		a[j+delta]=t;
	}
	
}


/*改进的希尔排序*/
void ShellSort_1(int a[],int n)
{
    int i,j;
    int t;
    int g;//表示间隔gap
    
    for(g=n/2;g>0;g=g/2){
        for(i=g;i<n;i++){
            t=a[i];
            for(j=i-g;j>=0&&t<a[j];j=j-g){
                a[j+g]=a[j];
            }
            a[j+g]=t;
        }
    }
    
}

/*归并排序*/
void Merge(int a[],int s1,int e1,int s2,int e2,int b[])
{
	int k=s1;
	int i=s1;
	
	while(s1<=e1 && s2<=e2){
		if(a[s1]<=a[s2]){
			b[k++]=a[s1++];
		}else{
			b[k++]=a[s2++];
		}
	}
	
	while(s1<=e1)b[k++]=a[s1++];
	while(s2<=e2)b[k++]=a[s2++];
	k--;
	while(k>=i){
		a[k]=b[k];
		k--;
	}
}
void MergeSort(int a[],int i,int j,int b[])
{
	int k;
	if(i<j){
		k=(i+j)/2;
		MergeSort(a,i,k,b);
		MergeSort(a,k+1,j,b);
		Merge(a,i,k,k+1,j,b);
	}
}

/*主函数*/
int main()
{
    int n;
    int i;
    
    scanf("%d",&n);
    for(i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    
    /*快速排序:满分(约3507 ms)*/
//     QuickSort(a,0,n-1);
    
    /*选择排序:满分(约3574 ms)*/
//     SelectionSort(a,n);
    
    /*冒泡排序:部分案例超时,超过了10000ms*/
//     BubbleSort(a,n);
    
    /*插入排序:满分(约3372 ms)*/
//     InsertionSort(a,n);
    
    /*希尔排序:满分(约33 ms);该版本需要多次调用*/
//     int g;
//     for(g=n/2;g>0;g=g/2){
//         ShellSort(a,n,g);
//     }
    
    /*希尔排序:满分(约30 ms);做了改进,使原来的ShellSort()变成了三层循环*/
//     ShellSort_1(a,n);
    
    /*归并排序:满分(约28 ms)*/
    MergeSort(a,0,n-1,b);
    
    
    for(i=0;i<n;i++){
        if(i==n-1)printf("%d",a[i]);
        else printf("%d ",a[i]);
    }
    return 0;
}
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值