珠子排序(Bead Sort)原理及展示(代码内)

#include <stdio.h>
#include <stdlib.h>
/*
珠子排序
时间复杂度: 约为O(n^2*k) ,空间复杂度:O(n*k+n)

排序过程展示: 
Size:5(数组大小) 
Max:10(数组中的正整数<Max) 

排序前:1  7  4  0  9

0  1  1  1  1  1  1  1  1      珠子数:1
0  0  0  0  0  0  0  1  1      珠子数:7
0  0  0  0  1  1  1  1  1      珠子数:4
1  1  1  1  1  1  1  1  1      珠子数:0
0  0  0  0  0  0  0  0  0      珠子数:9


上方的珠子已全部掉落至第5行
0  1  1  1  1  1  1  1  1
0  0  0  0  1  1  1  1  1
1  1  1  1  1  1  1  1  1
0  0  0  0  0  0  0  1  1
0  0  0  0  0  0  0  0  0


上方的珠子已全部掉落至第4行
0  1  1  1  1  1  1  1  1
1  1  1  1  1  1  1  1  1
0  0  0  0  1  1  1  1  1
0  0  0  0  0  0  0  1  1
0  0  0  0  0  0  0  0  0


上方的珠子已全部掉落至第3行
1  1  1  1  1  1  1  1  1
0  1  1  1  1  1  1  1  1
0  0  0  0  1  1  1  1  1
0  0  0  0  0  0  0  1  1
0  0  0  0  0  0  0  0  0


上方的珠子已全部掉落至第2行
1  1  1  1  1  1  1  1  1
0  1  1  1  1  1  1  1  1
0  0  0  0  1  1  1  1  1
0  0  0  0  0  0  0  1  1
0  0  0  0  0  0  0  0  0

数珠子

1  1  1  1  1  1  1  1  1      珠子数:0
0  1  1  1  1  1  1  1  1      珠子数:1
0  0  0  0  1  1  1  1  1      珠子数:4
0  0  0  0  0  0  0  1  1      珠子数:7
0  0  0  0  0  0  0  0  0      珠子数:9


排序后:0  1  4  7  9

完成排序 
*/ 

void dissort(int t[],int n,int max)
{
	int a=0;
	for(a=0; a<n; a++)
    {
        t[a] = rand()%max;
    }
}
void put(int t[],int n)
{
    int c=0;
    while(c<n)
    {
        printf("%d  ",t[c]);
        c++;
    }
    printf("\n");
}
void BeadSort(int t[],int n)
{
	int t2[n];//用于算盘展示 
	int t3[n];
	int max=0;
	int j,k;
	int count;
	/**/
	for(j=0;j<n;j++)
	{
		if(t[j]>max)
		{
		max=t[j];
		}
		t3[j]=0;
		t2[j]=t[j];
	} 
	int tt[n][max];
	for(j=0;j<n;j++)//初始化算盘 
	{
		for(k=0;k<max;k++)
		{
			tt[j][k]=1;
		}
	}
	/*for(j=0;j<n;j++)
	{
		t2[j]=max-t[j];
	}*/ 
	for(j=0;j<n;j++)//把珠子放入算盘 
	{
		for(k=0;k<max;k++)
		{
			if(t[j]!=0)
			{
				tt[j][k]=0;//0表示珠子 
				t[j]--;
			}
		}
	}
	for(j=0;j<n;j++)
	{
		count=0;
		for(k=0;k<max;k++)
		{
			printf("%d  ",tt[j][k]);
			count++;
			if(count==max)
			{
				printf("    珠子数:%d",t2[j]);
				printf("\n");
			}
		}
	}
	int j2;
	int j3,k2;
	int count2=n;
for(j2=0;j2<n-1;j2++)//算盘立起来 
{
	for(j=0;j<n-1;j++)
	{
		for(k=0;k<max;k++)
		{
			if(tt[j][k]==0)
			{
				int tem=tt[j][k];
				tt[j][k]=tt[j+1][k];
				tt[j+1][k]=tem;
			}
		}
	}
	/*printf("\n");printf("j2:%d  flg:%d  \n",j2,flg);*/

	printf("\n");
	printf("\n"); printf("上方的珠子已全部掉落至第%d行\n",count2);
	for(j3=0;j3<n;j3++)
	{
		
		count=0;
		for(k2=0;k2<max;k2++)
		{
			printf("%d  ",tt[j3][k2]);
			count++;
			if(count==max)
			{
				printf("\n");
			}
		}
	
	}
		count2--;
}
	for(j=0;j<n;j++)//从第一排开始,数珠子 
	{
		for(k=0;k<max;k++)
		{
			if(tt[j][k]==0)
			{
				t3[j]++;
			}
		}
	}
	printf("\n");printf("数珠子\n");printf("\n");
	for(j=0;j<n;j++)
	{
		count=0;
		for(k=0;k<max;k++)
		{
			printf("%d  ",tt[j][k]);
			count++;
			if(count==max)
			{
				printf("    珠子数:%d",t3[j]);
				printf("\n");
			}
		}
	}
	printf("\n");printf("\n");
	//printf("辅助数组:");put(t3,n);
	
	for(j=0;j<n;j++)
	{
		t[j]=t3[j];
	}
	
}
int main()
{
	/*int n=5;
	int t[5]={2,6,5,1,4};*/
	int n=5;
	int t[n];
    int max=5;
    printf("Size:%d\n",n);
    printf("Max:%d\n",max);
    dissort(t,n,max);
    printf("\n");printf("\n");
    printf("排序前:");put(t,n);
    printf("\n");printf("\n");
    
	BeadSort(t,n);
	printf("排序后:");put(t,n);
	printf("\n");printf("\n");
	return 0;
}

在这里插入图片描述

要想测试更多的数据量,得定义全局数组,这里只测试1000
要想测试更多的数据量,得定义全局数组,这里只测试1000。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fuill

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值