资源限制
时间限制: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;
}
两种实现排序方法