关于分治思想
查看原帖
关于分治思想
1206075
JiaDu_Yin楼主2023/12/1 19:33

在冒泡排序基础上优化,当数据量大时没有输出

#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;
        }
}

2023/12/1 19:33
加载中...