黑马程序员技术交流社区
标题:
关于for的冒泡循环
[打印本页]
作者:
yueguhua
时间:
2012-9-15 14:17
标题:
关于for的冒泡循环
都知道冒泡循环写法 这里就不写了 我想问下 第2个循环中
for (int j=0;j<数组长度.length-i-1 ;j ++)
里面额 -i我去掉过 输出也是循环 ~~
求高手来解释下为什么~~~ 有-i和没有-i什么区别 ?为什么我去掉-i时候也能输出排序
作者:
yueguhua
时间:
2012-9-15 14:35
木有人回答呢?????? 好郁闷
作者:
iamheima
时间:
2012-9-15 14:37
本帖最后由 iamheima 于 2012-9-15 14:44 编辑
那个区别就大了,因为每一次的内循环次数要受i的值的影响。
其实冒泡排序有多种写法,我一般这样写:
for (int i = 0; i < stuArr.Length; i++)
{
for (int j = 0; j < stuArr.Length - i - 1; j++)
{
if (stuArr[j].Score < stuArr[j + 1].Score)
{//交换
tempStudent = stuArr[j];
stuArr[j] = stuArr[j + 1];
stuArr[j + 1] = tempStudent;
}
}
}
复制代码
这个叫着下沉排序(也是冒泡排序的思想):
for (int i = 0; i < stuArr.Length; i++)
{
for (int j = stuArr.Length-1; j> 0; j--)
{
if (stuArr[j-1].Score < stuArr[j].Score)
{//交换
tempStudent = stuArr[j];
stuArr[j] = stuArr[j-1];
stuArr[j -1] = tempStudent;
}
}
}
复制代码
作者:
李 玉林
时间:
2012-9-15 14:53
-i后 进行比较的次数减少了 如果没有减-i 执行内部循环时 还会和已经排好序的元素进行比较 而-i之后就避免了
作者:
iamheima
时间:
2012-9-15 14:54
补充点吧。。。
在排序的过程中始终有两个区域:有序区和无序区,内循环的作用是每一次将“最轻”的元素放到无序区的最上面,然后有序区范围+1、无序区范围-1,这样通过array.length-1次外循环整个数组都有序了,也就是说i的作用是用来控制无序区的范围的,与其说你不明白-i和不减i的区别还不如说你不明白什么叫冒泡排序!
作者:
yueguhua
时间:
2012-9-15 15:00
iamheima 发表于 2012-9-15 14:54
补充点吧。。。
在排序的过程中始终有两个区域:有序区和无序区,内循环的作用是每一次将“最轻”的元素放 ...
嗯 虽然我不明白 但是我绝不会不懂装懂 像你这么拿一堆代码来贴上 然后又说一些 跟本和我问的不搭边的 解释 又贴了一个下沉排序 你是在炫耀自己么?? 你把冒泡排序里面if的< 换成>会发生什么啊 ? 拿代码唬人~~~ 还真有你的
作者:
王海舟
时间:
2012-9-15 15:33
我想外层for(int i=0;i<数组名.length-1;i++)你应该是明白的,那我们就主要分析内层循环。
举一个例子来说明吧:
对3、4、1、5、2、6这六个数进行由大到小冒泡排序。
for (int j=0;j<数组名.length-i-1;j++)
这是减 i 的情况
第一次循环后(外层1次):3、4、5、2、6、1
第二次循环后(外层1次):3、4、5、6、2、1(这里的2没有和1进行比较)
后面的类似
对3、4、1、5、2、6这六个数进行由大到小冒泡排序。
for (int j=0;j<数组名.length-1;j++)
这是不减 i 的情况
第一次循环后(外层1次): 3、4、5、2、6、1
第二次循环后(外层1次):3、4、5、6、2、1(这里的2和1进行了比较)
后面的类似
综上所述:
后一种方法比前一种方法的比较次数更多,这是没有必要的。
因为每次冒泡之后,冒上去的数一定是最小的,那我们剩下的数进行比较的时候显然不用和它们进行比较了。
作者:
许波
时间:
2012-9-15 19:06
不-i的话,i的值每自增一次,j就要做一次0到lengh-1的自加循环.. 因为前面的顺序已经确立了,这明显是多余的啊
作者:
刘欢(安阳)
时间:
2012-9-27 23:07
额,我个人觉得区别不大,就是外层每次循环,内层的计算次数多一点而已,现在的计算机硬件,你懂得~
当然能少计算更好不是吗?我一般是背下来这段代码
作者:
何学强
时间:
2012-9-28 10:00
让数组中的元素两两比较,(第i个与第i+1个比较),进过n(i-1)遍两两比较,
数组中的元素能按照我们预期的规律排序。 要从大到小排序,我们进行两两
比较的时候用<
10,20,30,40,50,60,70 原始数据7个元素
20,30,40,50,60,70,10第一趟比较6次。
30,40,50,60,70,20,10第二趟比较5次。
40,50,60,70,30,20,10第三趟比较4次。
50,60,70,40,30,20,10第四趟比较3次。
60,70,50,40,30,20,10第五趟比较2次。
70,60,50,40,30,20,10第六趟比较1次
也就是n个数需要排n-1趟
第t趟比较的次数为:N-t次
For(inti=0;i<numbers.length-1;i++)//外层控制趟数
{
For(int j =0;j<numbers.length-1-i;j++)//控制比较
{
if(>)
{
交换
}
}
}
作者:
蔡嘉
时间:
2012-9-28 21:20
苏坤老师的冒泡排序讲得很详细。可以回答你的问题。
作者:
李阳Leo
时间:
2012-9-29 11:30
iamheima 发表于 2012-9-15 14:54
补充点吧。。。
在排序的过程中始终有两个区域:有序区和无序区,内循环的作用是每一次将“最轻”的元素放 ...
骚年~~太猖狂了~~特来一顶!
作者:
杨进
时间:
2012-9-29 13:50
我喜欢把i从1开始算,看起来比较爽
for (int i = 1; i <= intArray.Length - 1; i++)
{
for (int j = 0; j < intArray.Length - i; j++)
{
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2