黑马程序员技术交流社区

标题: 选择排序与冒泡排序,为什么冒泡排序会存在下标越界问题 [打印本页]

作者: Seejun    时间: 2014-12-13 15:00
标题: 选择排序与冒泡排序,为什么冒泡排序会存在下标越界问题
选择排序为:
  1. /*
  2. 需求:使用选择排序法遍历一维数组
  3. 思路:1、定义并遍历数组
  4.           2、定义临时变量temp存放最值
  5.       3、用第一个数与其后的数逐个比较,获取最值
  6.           4、用第二个数与其后的数逐个比较,获取第二最值
  7.           5、以此类推,比较arry.length-1次,获得新数组,并遍历数组
  8. */
  9. class  ArryChange1
  10. {
  11.         public static void main(String[] args)
  12.         {
  13.                 int[]arry={12,8,21,9,14,5};
  14.                 System.out.print("原数组为:");
  15.                 for (int x:arry)
  16.                 {
  17.                         System.out.print(x+" ");
  18.                 }
  19.                 for (int a=0;a<arry.length ;a++ )
  20.                 {
  21.                         for (int b=a+1;b<arry.length ;b++ )
  22.                         {
  23.                                 if (arry[a]<arry[b])
  24.                                 {
  25.                                         int temp=arry[a];
  26.                                         arry[a]=arry[b];
  27.                                         arry[b]=temp;
  28.                                 }
  29.                         }
  30.                 }
  31.                 System.out.println();         //换行
  32.                 System.out.print("选择排序后的数组为:");
  33.                 for (int x:arry)
  34.                 {
  35.                         System.out.print(x+" ");
  36.                 }
  37.         }
  38. }
复制代码


-------------------------------------------------------------------------------------
冒泡排序为:
  1. /*
  2. 需求:使用冒泡排序法遍历一维数组
  3. 思路:1、定义并遍历数组
  4.           2、定义临时变量temp存放最值
  5.           3、从第一个数起,与其后相邻的数进行比较,最值互换,可想象为最值向右移(冒泡)
  6.           4、进行arry-1次比较后得到新数组,遍历数组*/
  7. class ArryChange2
  8. {
  9.         public static void main(String[] args)
  10.         {
  11.                 int[] arry={5,11,9,12,7,14};
  12.                 System.out.print("原数组顺序为:");
  13.                 for (int a=0;a<arry.length ;a++ )
  14.                 {
  15.                                 System.out.print(arry[a]+" ");
  16.                 }
  17.                 for (int a=0;a<arry.length ;a++ )            //for (int a=0;a<arry.length-1 ;a++ )
  18.                 {
  19.                         for (int b=0;b<arry.length-a ;b++ )    //for (int b=0;b<arry.length-a-1 ;b++ )
  20.                         {
  21.                                 if (arry[b]<arry[b+1])
  22.                                 {
  23.                                         int temp=arry[b];
  24.                                         arry[b]=arry[b+1];
  25.                                         arry[b+1]=temp;
  26.                                 }
  27.                         }
  28.                                
  29.                 }
  30.                 System.out.println();        //换行
  31.                 System.out.print("冒泡排序后数组顺序为:");
  32.                 for (int a=0;a<arry.length ;a++ )
  33.                 {
  34.                                 System.out.print(arry[a]+" ");
  35.                 }
  36.         }
  37. }
复制代码


--------------------------------------------------------------------------------------


冒泡排序为什么要-1才不会报错呢?

QQ图片20141213145919.jpg (77.78 KB, 下载次数: 20)

QQ图片20141213145919.jpg

作者: 史云龙    时间: 2014-12-13 15:06
a从1开始取就好了。或者b的最大值小于array.length-a-1。

  1. /**
  2. * @author 史云龙
  3. * 完成数组的快速排序
  4. * 数组【100,40,60,87,34,11,56,0】
  5. *冒泡排序:
  6. *从小到大排列
  7. */
  8. public class BubbleSort {

  9.         /**
  10.          * @param args
  11.          * 主函数
  12.          */
  13.         public static void main(String[] args) {
  14.                
  15.                 int[] array = {100,40,60,87,34,11,56,0};
  16.                 sop("未进行快速排序的数组:");
  17.                 print(array);
  18.                 sop("已经进行快速排序的数组:");
  19.                 sort(array);
  20.                 print(array);
  21.         }
  22.        
  23.         /**
  24.          * @param array
  25.          * 冒泡排序[从小到大排序]
  26.          * 算法说明:
  27.          * 1、比较相邻的元素。
  28.          *                 第1次比较第一个和第二个元素。
  29.          *                 第2次比较第二个和第三个元素。
  30.          *                 依次比较,如果前一个比后一个大则交换位置。
  31.          *                 第一轮比较后,将最大的元素移到最后一个位置。
  32.          * 2、因为还有进行后续轮数比较故用两个循环
  33.          *                 外层循环表示,轮数。
  34.          *                         i表示轮数
  35.          *                 内层循环表示,当前轮数,数组内元素比较。
  36.          *                         j表示元素内数组的位置。
  37.          * 3、每一轮比较取出一个最大的数,故需要比较array.length-1次。
  38.          *                 比较array.length-1次后剩余一个元素,不需要比较。
  39.          *                 每一次比较后,最大的数在最后故在元素内比较时,
  40.          *                 最后i个位置不要比较,同时在比较倒数最后两个位置时,
  41.          *                 需要考虑数组越界问题即j需要小于array.length-i
  42.          *                 即最大值为array.length-i-1。
  43.          */
  44.         public static void sort(int[] array){
  45.                 for(int i=1;i<array.length;i++){
  46.                         for(int j=0;j<array.length-i;j++){
  47.                                 if(array[j]>array[j+1]){
  48.                                         swap(array,j,j+1);
  49.                                 }
  50.                         }
  51.                 }
  52.                 /*
  53.                 for(int i=0;i<array.length-1;i++){
  54.                         for(int j=0;j<array.length-i-1;j++){
  55.                                 if(array[j]>array[j+1]){
  56.                                         swap(array,j,j+1);
  57.                                 }
  58.                         }
  59.                 }
  60.                 */
  61.         }
  62.         /**
  63.          * @param b【传入数组并进行打印】
  64.          */
  65.         public static void print(int[] b){
  66.                 for (int i=0;i<b.length;i++){
  67.                         sop(b[i]);
  68.                         if(i==b.length-1){
  69.                                 sop("\n");
  70.                         }else{
  71.                                 sop(" , ");
  72.                         }
  73.                 }
  74.                
  75.         }

  76.         /**
  77.          * @param array
  78.          * @param i
  79.          * @param j
  80.          * 将符合条件的数组数据交换位置
  81.          */
  82.         public static void swap(int[] array,int i,int j){
  83.                 int temp = array[i];
  84.                 array[i]=array[j];
  85.                 array[j]=temp;
  86.                
  87.         }
  88.         /**
  89.          * @param obj[将obj输出]
  90.          */
  91.         public static void  sop(Object obj){
  92.                 System.out.print(obj);
  93.         }
复制代码



作者: 李天富    时间: 2014-12-13 15:18
因为第一次内循环时,a=0,b最大值为arry.length-1,此时b+1就越界了。




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