蓝桥杯 基础练习 C 数列排序

资源限制

时间限制:1.0s 内存限制:512.0MB

问题描述

  给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200

输入格式

  第一行为一个整数n。   第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000。

输出格式

  输出一行,按从小到大的顺序输出排序后的数列。

样例输入

5 8 3 6 4 9

样例输出

3 4 6 8 9

#include <stdio.h>

int main()
{
    int a[500];    
    int i,j,n,t,m,low,high,x;
    //基数 
    scanf("%d",&n);
    //进数组
	for(i=0;i<n;i++){
		scanf("%d",&a[i]);
	} 
	//排序(冒泡排序,相邻交换,数组实现) 
/*	for(i=0;i<n-1;i++)
	{
		for(j=i+1;j<n;j++)
		{
			if(a[i]>a[j])
			{
				t=a[i];
				a[i]=a[j];
				a[j]=t;
				

​		}
​	}
} 

*/
	
	

//折半排序(数组实现) 
for(i=1;i<n;i++){
	x=a[i];             //将待插入a[i]代存到x 
	low=0;               //两个集合,前一个集合为有序,后面集合无序,将后面i位置上的无序元素一个一个插入到有序集合 
	high=i-1;             //所以low=0,high=i-1;
	while(low<=high)       //在有序集合中查找a[i]合适的插入位置 
	{
		m=(low+high)/2;
		if(x<=a[m]) high=m-1;
		else low=m+1;
		
	}                              //在上面查找之后,待插入位置即为high+1处 
	for(j=i-1;j>high;--j)         //上面确定位置后,将high位置之后的数据后移,最后j=high 
	{
	a[j+1]=a[j];
    }
	a[j+1]=x;                      //插入待排数据 (因为j=high,插入位置为j+1) 
		
} 
//出数组 
for(j=0;j<n;j++){
	
	printf("%d ",a[j]);
	 
}
return 0;	

}

两种实现排序方法

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值