当前位置: 代码迷 >> J2SE >> 大家伙儿给解释下桶排序
  详细解决方案

大家伙儿给解释下桶排序

热度:130   发布时间:2016-04-24 13:40:26.0
大家给解释下桶排序
关于桶排序的程序是:
void   SortProcedure()
{
int   bucket[][]=new   int[10][Datainputed+1];//最后一列保存这一行的数据个数(多了一列不是很明白)
int   pass=0;//扫描轮数计数

do
{
for(int   i=0;i <10;i++)
{
bucket[i][Datainputed]=0;//为什么不是全部赋为0;
}
for(int   i=0;i <Datainputed;i++)//分散扫描
{
int   temp1=(int)Math.pow(10,pass);
int   temp2=DataArray[i]/temp1%10;
bucket[temp2][bucket[temp2][Datainputed]++]=DataArray[i];//(这个地方也不是很懂,希望给解释清楚)
}
int   k=0;
for(int   i=0;i <10;i++)//集中扫描
for(int   j=0;j <bucket[i][Datainputed];j++)
dataArray[k++]=bucket[i][j];
for(int   i=0;i <DataArray.length;i++)//记录本轮选择后数据排列情况
SortPro[pass][i]=DataArray[i];
pass++;
}while(bucket[0][Datainputed]!=Datainputed);//一轮扫描(这个条件不懂)
}



------解决方案--------------------
看来LZ的能力距离我想象的差距还远啊
bucket[temp2][bucket[temp2][Datainputed]++]=DataArray[i];//(这个地方也不是很懂,希望给解释
首先看bucket[temp2][Datainputed]++,循环刚开始的时候,bucket[i][Datainputed]=0;
tmp2和i表示一个意思,是数组下标,那么bucket[temp2][Datainputed]++的结果是什么?自己想吧
i++知道什么意思吗,先返回i的值,然后i再加1
根据这个,bucket[temp2][bucket[temp2][Datainputed]++]=DataArray[i];相当于
bucket[temp2][bucket[temp2][Datainputed]]=DataArray[i];
bucket[temp2][Datainputed]++;
这些能理解吗,自己多想想吧

while(bucket[0][Datainputed]!=Datainputed);//一轮扫描(这个条件不懂)
感觉你基本没给解释啊
根据上面,当tmp2=0时,就是bucket[0][Datainputed],tmp2=0的情况是什么,自己想吧

把我上面的例子改一下,DataArray={125, 98},Datainputed=2
第一次循环,pass=0时
int temp1=(int)Math.pow(10,pass); //tmp1=1
int temp2=DataArray[i]/temp1%10; //i=0时tmp2=5, i=1时tmp2=8
此时由于bucket[0][Datainputed]没有累加过(bucket[0][Datainputed]++没发生过),所以while(bucket[0][Datainputed]!=Datainputed);条件满足,继续循环

第二次循环,pass=1时
int temp1=(int)Math.pow(10,pass); //tmp1=10
int temp2=DataArray[i]/temp1%10; //i=0时tmp2=2, i=1时tmp2=9
此时由于bucket[0][Datainputed]没有累加过(bucket[0][Datainputed]++没发生过),所以while(bucket[0][Datainputed]!=Datainputed);条件满足,继续循环

第三次循环,pass=2时
int temp1=(int)Math.pow(10,pass); //tmp1=100
int temp2=DataArray[i]/temp1%10; //i=0时tmp2=1, i=1时tmp2=0
此时由于bucket[0][Datainputed]进行过一次累加(bucket[temp2][Datainputed]++),也就是bucket[0][Datainputed]=1,当时数组元素有2个,也就是Datainputed=2,所以while(bucket[0][Datainputed]!=Datainputed);条件满足,继续循环

第四次循环,pass=3时
int temp1=(int)Math.pow(10,pass); //tmp1=1000
int temp2=DataArray[i]/temp1%10; //i=0时tmp2=0, i=1时tmp2=0
此时由于bucket[0][Datainputed]进行过两次次累加(bucket[temp2][Datainputed]++),也就是bucket[0][Datainputed]=2,和数组元素个数Datainputed=2一样,所以while(bucket[0][Datainputed]!=Datainputed);条件不满足,循环推出

当pass不断增大时,tmp2=0开始出现并增多(为什么?因为pass增大,tmp1增大,当DataArray[i]的位数(个十百千万的意思)小于tmp1的位数时,tmp2就等于0),当DataArray[i]的位数(个十百千万的意思)大于或等于tmp1的位数时,tmp2就不为0,说明还有大的数没有进行排列,此时bucket[0][Datainputed]就不会等于数组个数Datainputed,所以循环继续进行。当DataArray[i]的位数(个十百千万的意思)都小于tmp1的位数时,此时tmp2都是0,说明已经不存在比tmp1大的数没有被排列的情况了,这时bucket[0][Datainputed]和数组个数Datainputed是相等的,所以循环条件不满足。

这样说明LZ明白了吧,这么简单的逻辑,还要别人一步一步讲解,LZ能力还差远啊,加油吧,自己多动脑想一想,那样才能提高