在冒泡排序基础上优化,当数据量大时没有输出
#include <stdio.h>
#include <stdlib.h>
#include "math.h"
//排序
void pop_sort(int l,int r);
int a[10001];
int main()
{
int n,t,k;//n为个数,t,i,j用于历遍数组,k为标记,temp用于swap
scanf("%d",&n);
//输入
for(t=0;t<n;t++)
scanf("%d",&a[t]);
//分组
int length=sqrt(n);
int num=(n-1)/length+1;
int left[num],right[num];
for(int t=0;t<num-1;t++)
{
left[t]=t*length; //计算每组的左边界和右边界
right[t]=(t+1)*length-1;
}
left[num-1]=(num-1)*length;//最后一组单独计算
right[num-1]=n-1;
//排序
for(int t=0;t<num;t++)
pop_sort(left[t],right[t]);
//合并
int b[n];
for(int t=0;t<n;t++)
{
int aim=0;
for(k=0;k<num;k++)
if(left[k]<=right[k]){aim=k;break;} //寻找第一个非空序列的第一项
for(k=0;k<num;k++)
{if(left[k]>right[k]) continue;
if(a[left[aim]]>a[left[k]]) aim=k;}
b[t]=a[left[aim]];
left[aim]++; //录入后 原序列的第一项后移一位
}
//输出
for(t=0;t<n;t++)
printf("%d ",b[t]);
}
void pop_sort(int l,int r)
{
for(int i=l;i<r-l-1;i++)
{
int k=i;
for(int j=i+1;j<r-l;j++)
if(a[k]>a[j]) k=j;
int temp=a[i]; a[i]=a[k]; a[k]=temp;
}
}