黑马程序员技术交流社区

标题: 自己写的冒泡排序,为什么有错误 [打印本页]

作者: 廿乙木    时间: 2014-8-11 21:57
标题: 自己写的冒泡排序,为什么有错误
/*
*第二题: 请列举您了解的一些排序算法,并用Java语言实现一个效率较高的。
* 答:我知道的有选择排序法,冒泡排序法,还有快速排序法
* 以下是我自己写的冒泡排序法。
*/

package com.itheima;

public class Text2 {
        /* 打印函数 */
        public static void sop(Object obj) {
                System.out.println(obj);
        }

        /* 打印数组函数 */
        public static void show(int arr[]) {
                for (int x = 0; x < arr.length; x++)
                        sop(arr[x]);
        }

        public static void main(String[] args) {
                int arr[] = { 1, 5, 3, 9, 0, 6, 8, 9, 4 };// 定义一个一维数组

                show(arr);// 打印原数组
                for (int i = 0; i <= arr.length - 1; i++) {// 外循环
                        for (int j = 0; j <= arr.length - i - 1; j++) {// 内循环相邻比较

                                if (arr[j] < arr[j + 1]) {// 通过一次循环将最大的元素放最后
                                        int temp = arr[j];
                                        arr[j] = arr[j + 1];
                                        arr[j + 1] = temp;
                                }
                        }
                }
                show(arr);

        }
}
错误提示:Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 9
        at com.itheima.Text2.main(Text2.java:27)

求解答
作者: 廿乙木    时间: 2014-8-11 22:04
哎。自己解决了,把《=换成《就好了。

作者: jiangweibin2573    时间: 2014-8-11 22:04

  1. for (int i = 0; i <= arr.length - 1; i++) {//这里不需要=号,应为只需要比较到倒数第二位
  2.                                 //如果你这样的话,当你i=0,下面的j=arr.length-1,那么j+1就越界了
  3.         for (int j = 0; j <= arr.length - i - 1; j++) {
  4.                     if (arr[j] < arr[j + 1]) {
  5.                              int temp = arr[j];
  6.                              arr[j] = arr[j + 1];
  7.                              arr[j + 1] = temp;
  8.              }
  9.        }
  10. }
复制代码


作者: 一顿一只牛    时间: 2014-8-11 22:05
   for (int j = 0; j <= arr.length - i - 1; j++) {// 内循环相邻比较
条件判断错了  数组交表越界异常。 改成  j < arr.length - i - 1就行了
不然下面判断arr[j + 1]的时候发生越界
作者: 复仇者联盟    时间: 2014-8-11 22:16
for (int i = 0; i <= arr.length - 1; i++) {//这里不需要=号,应为只需要比较到倒数第二位
                                //如果你这样的话,当你i=0,下面的j=arr.length-1,那么j+1就越界了
        for (int j = 0; j <= arr.length - i - 1; j++)
二楼回答的不是很全,即使i不等于arr.length - 1,但它还是可以等于0,那么j还是有可能等于arr.length - 1,因为下面有用到j+1,这样j就会出现数组角标越界异常。
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 9
作者: 复仇者联盟    时间: 2014-8-11 22:18
所以j角标也不能等于arr.length - i - 1。
作者: 〆_、Wali    时间: 2014-8-11 22:57
这个是数组越界的问题!
作者: conglin1991    时间: 2014-8-11 23:57
才看完的 竟然不会。。。
作者: Troy123    时间: 2014-8-12 00:06
:L  =。。。。。
作者: Huberry    时间: 2014-8-12 01:34
for (int i = 0; i <= arr.length - 1; i++) //越界了
作者: 冒牌高手    时间: 2014-8-12 05:37
那个错误原因是判断语句中的a[j]>a[j+1],因为你的j取值范围最大为arr.length,再+1就会超限,该改为a[i]>a[j]。并且有重复比较,外循环改为for(int i=0;i<arr.length-1;i++)内循环该改为for(int j=i+1;j<arr.length;j++)
作者: sunshine9091    时间: 2014-8-12 06:54
楼主是没明白里面具体的实现过程吧!
作者: 君行    时间: 2014-8-12 10:41
学习了                                                              
作者: 酋长第一    时间: 2014-8-12 12:29
数组长度越界
作者: inception    时间: 2014-8-12 12:31
。。。。。。。。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2