关于桶排序的程序是:
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);//一轮扫描(这个条件不懂)
}

解决方案 »

  1.   

    比如这样的数组DataArray={65,18,24,21,45}, Datainputed=5 //数组个数
    首先按个位进行分组,也就是个位数相同的
    1  2  3  4  5  6  7  8  9
    21       24 65       18
                45
    得到数组
    bucket[1][0]=21
    bucket[1][Datainputed]=1 -> 这个表示有1个元素
    bucket[4][0]=24
    bucket[4][Datainputed]=1 -> 这个表示有1个元素
    bucket[5][0]=65
    bucket[5][1]=45
    bucket[5][Datainputed]=2 -> 这个表示有2个元素   
    bucket[8][0]=18
    bucket[8][Datainputed]=1 -> 这个表示有1个元素   然后集中扫描,得到数组
    DataArray={21, 24, 65, 45, 18}SortPro[pass][i]=DataArray[i]; //这里只是记录一下每次排序后的结果,不要也可以接着pass++,然后回到循环开始,按十位进行分组
    1  2  3  4  5  6  7  8  9
    18 21    45    65
       24
    得到数组
    bucket[1][0]=18
    bucket[1][Datainputed]=1 -> 这个表示有1个元素
    bucket[2][0]=21
    bucket[2][1]=24
    bucket[2][Datainputed]=2 -> 这个表示有2个元素
    bucket[4][0]=45
    bucket[4][Datainputed]=1 -> 这个表示有1个元素
    bucket[6][0]=65
    bucket[6][Datainputed]=1 -> 这个表示有1个元素然后集中扫描,得到数组
    DataArray={18, 21, 24, 45, 65}SortPro[pass][i]=DataArray[i]; //这里只是记录一下每次排序后的结果,不要也可以接着pass++,然后回到循环开始,按百位进行分组
    由于数组元素都小于100,所以tmp2都是0
    所以得到数组
    bucket[0][0]=18
    bucket[0][1]=21
    bucket[0][2]=24
    bucket[0][3]=45
    bucket[0][4]=65
    bucket[0][Datainputed]=5 -> 这个表示有5个元素循环条件不满足,终止循环,于是得到结果这样解释,LZ应该可以理解程序了吧 
                   
                
      

  2.   

    还是不太明白为什么
    bucket[1][0]=21
    bucket[1][Datainputed]=1 -> 这个表示有1个元素,为什么表示有一个元素,还有那个
    bucket[temp2][bucket[temp2][Datainputed]++]=DataArray[i];//(这个地方也不是很懂,希望给解释清楚)
    while(bucket[0][Datainputed]!=Datainputed);//一轮扫描(这个条件不懂)
    感觉你基本没给解释啊
      

  3.   

    看来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能力还差远啊,加油吧,自己多动脑想一想,那样才能提高