黑马程序员技术交流社区
标题:
关于冒泡,你来冒冒泡吧。。。。
[打印本页]
作者:
陈志强
时间:
2013-5-7 00:12
标题:
关于冒泡,你来冒冒泡吧。。。。
本帖最后由 陈志强 于 2013-5-8 18:19 编辑
class sort3
{
public static void main(String[] args)
{
int[] arr2={44,4,64,13,8};
for (int a=0;a<arr2.length;a++ )
{
for (int b=0;b<arr2.length-a-1 ;b++ )
{
if (arr2[b]>arr2[b+1])
{
int temp=arr2[b];
arr2[b]=arr2[b+1];
arr2[b+1]=temp;
}
}
System.out.print(arr2[a]+" ");
}
}
}
复制代码
抱歉,很新人的问题,但是很纠结,这样写究竟哪儿写错了,还望各位大神批评,这样的写法对吗?我被结果吓着了,渴求答案,谢谢!
作者:
孙金鑫
时间:
2013-5-7 01:03
class sort3
{
public static void main(String[] args)
{
int[] arr2={44,4,64,13,8};
for (int a=0;a<arr2.length;a++ )
{
for (int b=0;b<arr2.length-a-1 ;b++ )
{
if (arr2[b]>arr2[b+1])
{
int temp=arr2[b];
arr2[b]=arr2[b+1];
arr2[b+1]=temp;
}
}
}
for(int x = 0;x<arr2.length;x++)
System.out.print(arr2[x]+" "); //注意这里,你放错位置了,你所放的位置,是外层循环每循环一次,内存循环做比较而改变的内容
}
}
复制代码
作者:
风乐
时间:
2013-5-7 01:38
冒泡排序是逐次把大数往后置换的,所以确定顺序是从后往前来的,而你打印数据是从前往后打印的,也就是你打印出来的数据顺序其实还没排好,是不确定的,这就导致等打印8的时候因为它比13小被13给置换到前面去了。
作者:
刘兆华
时间:
2013-5-7 05:06
本帖最后由 刘兆华 于 2013-5-7 05:08 编辑
public class Bubblesort {
static void bubblesort(int[] a) {
int temp;
for (int i = 0; i < a.length-1; i++) {//-1是因为最后一个没必要再跟它本身比较
for (int j = 0; j < a.length-i-1 ; j++) {
if (a[j] > a[j+1]) {
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
}
}
复制代码
我看到的错误 首先就是会抛出异常 你的最外层的for循环 arr2.length 没有-1 数组角标越界!
作者:
zms2100
时间:
2013-5-7 07:45
顶........沙发的解释是对的。
(帮助理解,O(∩_∩)O~)那打印语句不能放在外循环中,因为每次内循环一结束,就打印一次排序后的结果(在第二次的时候,因为在最后面的8还没有被换到应该在的第二个位置,这时是13在这个位置),所以第二次、第三次内循环结束打印的结果就都是13.
LZ本来是想偷懒结果弄巧成拙了,对吧,O(∩_∩)O~。要节省代码可以写高级for循环 : (这个是视频后面的内容,不知道LZ看到那里了没,当了解吧)
for(int i : arr2) // int i : 是要遍历的数组或集合(int[] arr2)的返回值类型+ 给返回值的命名,因为循环体中要用到。
{
System.out.println( i + " "); //是 i 而不是 arr[1],因为高级for循环每次取出的值是(类似) arr[x]。
}
作者:
兴朗ok
时间:
2013-5-7 09:52
public class SortDemo {
/**
* @param args
*/
public static void main(String[] args) {
Demo();
}
private static void Demo() {
int[] arr2 = { 44, 4, 64, 13, 8 };
for (int a = 0; a < arr2.length-1; a++) {//外圈是控制循环的次数
//并且这个地方应该让arr2.length 减1 因为在内圈比较的时候b+1就已经达到数组的长度
for (int b = 0; b < arr2.length - a - 1; b++) {//内圈是控制比较的次数,
//-a是为了让外循环增加一次,内循环参数与比较的元素个数递减
//-1 防止角标越界
if (arr2[b] > arr2[b + 1]) {//比较,记录住每次比较后的较大的值
//将较大的数与较小的数位置置换
int temp = arr2[b];
arr2[b] = arr2[b + 1];
arr2[b + 1] = temp;
}
}
// System.out.print(arr2[a] + " "); 不应该放在这个地方 这个地方是内圈的循环
//结束后,则会输出在外圈a=0时 这个位置的数值 因此会出现重复的现象
//应该放在外圈循环,等外圈结束后 ,在去遍历取出 则没有问题啦!!
}
for (int i = 0; i < arr2.length; i++) {
System.out.print(arr2[i]+" ");//注意这里应该将a变成i, 因为a的生命周期在上面的for结束后就结束啦
}
}
}
作者:
梁海君
时间:
2013-5-7 14:54
哈哈,我也是结合各位大侠的解答才懂,原来外层循环没结束LZ就打印了,受教了
作者:
zms2100
时间:
2013-5-7 14:58
梁海君 发表于 2013-5-7 14:54
哈哈,我也是结合各位大侠的解答才懂,原来外层循环没结束LZ就打印了,受教了 ...
O(∩_∩)O~.........其实有时候我们也是看着别人的错误,才发现原来还能这样,O(∩_∩)O~
看得多了,说不定以后可以应付想坑人的面试官,O(∩_∩)O哈哈哈~
作者:
王婷婷
时间:
2013-5-7 18:20
本帖最后由 王婷婷 于 2013-5-7 18:21 编辑
07.for (int a=0;a<arr2.length;a++ ) 这里a<arr2.length-1 因为当每次比较到最后一个时,最后一个元素不需要再比较
写一下自己对冒泡排序的理解吧:
取相邻的两个元素比较,如果符合条件则两个元素换位。
在换位的时候要定义一个第三方变量用于记录相对来说大的元素(当然排序的顺序可以是从大到小或从小到大)
还是建议将换位的具体流程用画图的方式表现出来,只要自己动手将排序的流程理清楚,基本上代码也就出来了(呃,我有的时候,虽然能明白流程还是写不出代码)
所以,必要的时候也可以记着理解。
public static void bubbleSort(int[] arr)
{
//当每次比较到最后一个时,最后一个元素不需要再比较
for (int x = 0;x<arr.length-1 ;x++ )
{
//当每比较一次,被比较的元素就会减少1 -x
//避免角标越界 -1
for (int y = 0;y<arr.length-x-1 ; y++)
{
//如果arr[y]>arr[y+1],置换位置,
if (arr[y]>arr[y+1])
{
//定义第三方变量记录最大值,然后换位
int temp = arr[y];
//此时arr[y]>arr[y+1],将两个元素交换位置,将arr[y+1]赋给arr[y],此时y角标位置没有元素
arr[y] = arr[y+1];
//将大值temp放到y角标位置
arr[y+1] = temp;
}
}
}
}
主函数调用bubbleSort()方法
int[] arr = {3,2,8,5,7,11};
bubbleSort(arr);
作者:
曹睿翔
时间:
2013-5-7 19:29
如果问题解决请再次编辑,修改为已解决,若还有疑问,请继续追问
作者:
黑马-雷钊
时间:
2013-5-8 14:46
System.out.print(arr2[a]+" ");
这句写错了。数组输出不是这样的。
需要重新定义一个for循环。这种打印也可以叫遍历数组。
for(int x = 0 ; x < arr.length ; x ++) {
System.out.println(arr[x]);//这样的话你随便传个数组进来for都会从0角标开始打印。一只打到数组的最大角标的时候停。
}
你的排序方法写的是正确的。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2