求k桶法排序的C语言代码k桶法:k桶法有两个主要步骤:分桶,整合.分桶:把n个数依次放入k个桶中,除了第k个桶外,放入前k-1个桶中的数都要求后一个大于前一个.分桶的具体规则如下:第1个数
来源:学生作业帮助网 编辑:六六作业网 时间:2024/11/09 00:32:54
求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;
}
运行结果截图: