关于桶排序的程序是:
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);//一轮扫描(这个条件不懂)
}
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);//一轮扫描(这个条件不懂)
}
解决方案 »
- 在myeclipse中如何将JAVA小程序做成可以执行的文件,如JAR或BAT?
- 求一正则表达式算法, 100分,谢谢
- 构造函数调用的一点小问题
- 请问我怎么把这个list里面的东西取出来?
- 求一字符替换的正则表达式!!!!!!!!!!! 越简单越好!`~~~
- 如何给jProgressBar设置颜色和风格
- Collections 提供不可修改集合的目的
- 那里有jbuilder
- ???????高分请教一个方法××怎样在java中调用存储函数(oracle)?
- 运行Hadoop1.2.1示例Sort.java一直报错
- 一个JAVA读取字符串的问题
- ?????由字符串得到数组下标的问题?急急急急急急急急急急急急急急急急急急?????
首先按个位进行分组,也就是个位数相同的
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应该可以理解程序了吧
bucket[1][0]=21
bucket[1][Datainputed]=1 -> 这个表示有1个元素,为什么表示有一个元素,还有那个
bucket[temp2][bucket[temp2][Datainputed]++]=DataArray[i];//(这个地方也不是很懂,希望给解释清楚)
while(bucket[0][Datainputed]!=Datainputed);//一轮扫描(这个条件不懂)
感觉你基本没给解释啊
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能力还差远啊,加油吧,自己多动脑想一想,那样才能提高