A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© tc4892998 中级黑马   /  2014-5-23 22:03  /  1381 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我在进行选择排序的练习,代码如下:
package com.itheima;

import java.util.Arrays;
/*
* 3、 请列举您了解的一些排序算法,并用Java语言实现一个效率较高的。
*/
public class Test03 {
/*
* 在排序方法中,分别有插入排序法,归并排序,快速排序,冒泡排序,希尔排序,选择排序 那么我将用Java语言实现选择排序
*/

        public static void main(String[] args) {
                // 创建一个数组
                int[] arr = { 1, 22, 57, 31, 5, 8, 43, 98, 37 };

                System.out.println("排序前的数组为:" + Arrays.toString(arr));
                // 循环方法进行选择排序
                for (int i = 0; i < arr.length; i++) {
                        for (int j = i + 1; j < arr.length - 1; j++) {
                                if (arr[i] > arr[j]) {
                                        int temp = arr[i];
                                        arr[i] = arr[j];
                                        arr[j] = temp;
                                }
                        }
                }
                System.out.println("排序后的数组为:" + Arrays.toString(arr));
        }

}


运行后如图所示,请问这是什么情况?如果把   j<arr.length-1 改成  j<arr.length 则输出正常...
请指教

Error.jpg (170.08 KB, 下载次数: 9)

Error.jpg

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

5 个回复

倒序浏览
而且我有2个类文件,一个类运行出来是正确的结果,一个就如图所示.
2个的代码是复制粘贴的...
回复 使用道具 举报
我找到错误的地方了...是我的代码里有错误,
在第19与20行,应该是    i<arr.length- 1    j<arr.length
回复 使用道具 举报
我也经常这样,粗心大意真的会害死人啊
回复 使用道具 举报
本帖最后由 294645832 于 2014-5-24 10:33 编辑
  1. package com.itheima;

  2. import java.util.Arrays;

  3. public class Paixu {
  4.                 /*
  5.                 选择排序。
  6.                 内循环结束一次,最值出现头角标位置上。
  7.                 */
  8.                 public static void main(String[] args)
  9.                 {
  10.                         int[] arr={5,1,6,4,2,8,9};

  11.                         printArr(arr);

  12.                         Arrays.sort(arr);//排序、、、
  13.                         printArr(arr);
  14.                 }

  15.                 public static void getpaixu(int[] arr)
  16.                 {
  17.                         for (int x=0;x<arr.length-1 ;x++ )
  18.                         {
  19.                                 for (int y=x+1;y<arr.length ;y++ )
  20.                                 {
  21.                                         {
  22.                                                 if (arr[x]>arr[y])
  23.                                                 {
  24.                                                         /*
  25.                                                         int temp=arr[x];
  26.                                                         arr[x]=arr[y];
  27.                                                         arr[y]=temp;
  28.                                                         */
  29.                                                         swap(arr,x,y);
  30.                                                 }
  31.                                         }
  32.                                 }
  33.                         }
  34.                 }
  35.                 public static void swap(int[] arr,int x,int y)
  36.                 {
  37.                         int temp=arr[x];
  38.                         arr[x]=arr[y];
  39.                         arr[y]=temp;
  40.                 }
  41.                 public static void printArr(int[] arr)
  42.                 {
  43.                         for (int x=0;x<arr.length ;x++ )
  44.                         {
  45.                                 //System.out.print("arr["+x+"]="+arr[x]+";");
  46.                                 System.out.print(arr[x]+";");
  47.                         }
  48.                         System.out.println();
  49.                 }
  50. }
复制代码

应该为外循环中的x<arr.length-1,
因为当外循环的x到达最后一位时如果都为arr.length                                                          x角标为6,y也为6

那么角标同样指到了最后一位是没有必要的,所以优化一下,x<arr.length-1   当x<arr.length-1的时候,                                                                                                                                                       x指到了角标5,y指到了角标6.

如果 按照你的来,x角标为6的时候,y则是5,所以少遍历了一位。

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报
294645832 发表于 2014-5-24 10:29
应该为外循环中的x

那最下方的那个error是怎么回事呢?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马