求k桶法排序的C语言代码k桶法:k桶法有两个主要步骤:分桶,整合.分桶:把n个数依次放入k个桶中,除了第k个桶外,放入前k-1个桶中的数都要求后一个大于前一个.分桶的具体规则如下:第1个数

来源:学生作业帮助网 编辑:作业帮 时间:2024/05/06 18:47:13

求k桶法排序的C语言代码k桶法:k桶法有两个主要步骤:分桶,整合.分桶:把n个数依次放入k个桶中,除了第k个桶外,放入前k-1个桶中的数都要求后一个大于前一个.分桶的具体规则如下:第1个数
求k桶法排序的C语言代码
k桶法:k桶法有两个主要步骤:分桶,整合.
分桶:把n个数依次放入k个桶中,除了第k个桶外,放入前k-1个桶中的数都要求后一个大于前一个.分桶的具体规则如下:
第1个数放入第一个桶内,第2个数若大于第一个桶中的数(即第一个数)则放入第一个桶内,否则放入第二桶内,以此类推.设现要将第j个数放入某桶中,先从第一个桶试起,若第j个数大于当前第一个桶中最后一个数,则放入第一个桶中,否则试放第二个桶,以此类推,若前k-1个桶都不能放入,则直接放入第k个桶.
整合:把k个桶中当前排在最前面的数中最小者依次放回到原数组中,直到k个桶空为止.
若整合后的数组已排好序,则算法停止,否则重新分桶、整合,直到排好序为止.
对于k桶法要求可以改变k的值,并通过试验观察k的影响.

求k桶法排序的C语言代码k桶法:k桶法有两个主要步骤:分桶,整合.分桶:把n个数依次放入k个桶中,除了第k个桶外,放入前k-1个桶中的数都要求后一个大于前一个.分桶的具体规则如下:第1个数
#include <stdio.h>  //for printf
#include <stdlib.h> //for srand rand
#include <time.h>   //for time
#include <memory.h> //for memset
#define M 99
#define N 25
#define K 4
int a[N];             //待排序数组
int b[K][N]={0};  //桶
int c[K]={0};      //分桶时,用来记录每个桶中数据个数
int d[K]={0};      //组合时,用来记录已经处理数据个数
void print(char *pre,int a[], int n)
{
  int i;
  printf("%s", pre);
  for(i=0;i<n;i++) printf("%3d", a[i]);
  printf("\n");
}
void FillA()
{
  int i,j,t,x[M];
  for(i=0;i<M;i++) x[i]=i+1;
  for(i=0;i<M;i++) {j=rand()%M;t=x[i];x[i]=x[j];x[j]=t;}
  for(i=0;i<N;i++) a[i]=x[i];
  print("--:", a, N);
}
int bucket(int a[], int n, int k)
{
  int i,j,flag=0;
 
  //分桶
  for(i=0;i<N;i++)
  {
    for(j=0;j<k-1;j++)
    {
      if(c[j]==0 || b[j][c[j]-1]<a[i])
      {
        b[j][c[j]++]=a[i];
        break;
      }
    }
    if(j>=k-1) b[j][c[j]++]=a[i];
  }
 
  //输出当前桶中的数据
  for(i=0;i<k;i++) print("  :",b[i], c[i]);
 
  //组合
  for(i=0;i<N;i++)
  {
    int min=M,mink=0;
    for(j=0;j<k;j++)
    {
      if(d[j]<c[j] && b[j][d[j]]<min)
      {
        min=b[j][d[j]];
mink=j;
      }
    }
    a[i]=min;
    d[mink]++;
   
    //更新排序完成标识flag
    if(flag==0 && i>0 && a[i]<a[i-1]) flag=1;
  }
 
  //输出组合后的数组
  print("--:", a, N);
 
  return flag;
}
int main()
{
  srand(time(0));
  FillA();
 
  do
  {
    memset(b,0,N*K*sizeof(int));
    memset(c,0,K*sizeof(int));
    memset(d,0,K*sizeof(int));
  } while(bucket(a,N,K));
 
  return 0;
}
运行结果截图: