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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 罗雪梅 中级黑马   /  2012-9-22 08:04  /  2743 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 罗雪梅 于 2012-9-24 15:14 编辑

数组排序的时候,为了提高效率都是精确到比较中的最后一位元素的,但是无论是冒泡还是选择,最外层循环

for(int i=0;i<arr.length-1;i++)

元素进行比较的时候第一圈,都应该是比较到最后一位元素的,所以应该循环条件应该是 i<arr.length 啊要不最后一位的元素就比较不到了,可是执行的时候却没有问题,显示的结果反应出来是最后一位元素也参加了比较的,这个一直就没搞明白

如果i<arr.length-1那不就相当于只是比较到了到数第二个元素吗?

评分

参与人数 1黑马币 +30 收起 理由
王海宇 + 30

查看全部评分

7 个回复

倒序浏览
给你一个数A,无需比较。
给你两个数A,B,比较一次就可以计算出结果。
给你三个数A,B,C,需比较两次。

上面的比较对应外循环的循环次数。
建议找本数据结构的数来看下,这个看完之后很简单的
回复 使用道具 举报
orgcheng 发表于 2012-9-22 08:21
给你一个数A,无需比较。
给你两个数A,B,比较一次就可以计算出结果。
给你三个数A,B,C,需比较两次。

好的,谢谢
回复 使用道具 举报
楼主可能没仔细注意

冒泡算法是当前a[x]与a[x+1]比较 所以上面虽然是length-1 但是加个一就相当于到了最后一个

选择则是固定外层的一个数,与内层从i=a[1]比较到a[a.length-1],即最后一个。


不知道楼主有没有理解,如果不太理解,可以设置断点自己调试下,看程序执行顺序就一目了然了
回复 使用道具 举报
int [] arr = {1,2,3,4,5};//数组的长度是5
for(int x=0 ;x<arr.length-1;x++)//因为x是从0开始到arr.length-1整好是5个,楼主可以看成for循环遍历的是数组的角标,而length是数组的大小。
回复 使用道具 举报
                   int [] arr={1  ,4  ,5  ,7  ,8  ,9  ,12 };这里数组的长度就是7 ,那就相当于arr.length=7;
                                    ^  ^   ^  ^   ^  ^    ^
                                     |   |    |   |     |   |     |

arr数组对应的角标   [   0   1   2   3   4   5    6  ]计算机科学的计数方式一般都是从0开始计算的,这点要注意
所以arr.length-1=6, 6才是最后一个角标的位置
回复 使用道具 举报
首先,要了解冒泡法排序的思想:
依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。

在此,对于for(int i=0;i<arr.length-1;i++)是外层循环,用于控制循环次数的,楼主可以这样想,如果是10个数,你要比较多少趟才可以知道其中那个数是最大或最小,毋庸置疑,9次,以下再来个例子:
/**
* 冒泡法排序 对整数数组进行升序
* @author zhang
*
*/
public class BubbleSort {

        public static void main(String[] args) {
               
                //定义一个用于测试的整数数组
                int[] arr = {8,5,23,68,3,9,1};
               
                System.out.print("排序前的数组为:");
                for(int i=0;i<arr.length;i++) {
                        System.out.print(arr[i]+" ");
                }
                System.out.println();
               
                //调用排序的方法
                bubbleSort(arr);
               
                System.out.print("排序后的数组为:");
                for(int i=0;i<arr.length;i++) {
                        System.out.print(arr[i]+" ");
                }
        }

        //冒泡排序:依次比较相邻的两个数,将小数放在前面,大数放在后面.就像气泡往上升,所以称作冒泡排序
        private static void bubbleSort(int[] arr) {
               
                //外层循环用于控制循环趟数
                for(int i=0;i<arr.length-1;i++) {
                        //内层循环进行数据的比较,-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;
                                }
                        }
                }
        }
}

而对于选择法: 
首先以一个元素为基准,从一个方向开始扫描,比如从左至右扫描,以A[0]为基准。   
接下来从A[0],…,A[9]中找出最小的元素,将其与A[0]交换。   
然后将基准位置右移一位,重复上面的动作,比如,以A[1]为基准,找出A[1]~A[9]中最小的,将其与A[1]交换。  
一直进行到基准位置移到数组最后一个元素时排序结束(此时基准左边所有元素均递增有序,而基准为最后一个元素,故完成排序)。
n个记录的文件的选择排序可经过n-1趟直接选择排序得到有序结果

而对于for(int i=0;i<arr.length-1;i++),也是用来控制比较次数的,以下是例子,希望对楼主有帮助:
//选择排序:两两比较
        private static void selectSort(int[] arr) {
                //外层循环既用于控制循环趟数,也是比较的数组下标
                for(int i=0;i<arr.length-1;i++) {
                //内层循环进行数据的比较
                for(int j=i+1;j<arr.length;j++){
                //相邻的两个数进行相互比较
                if(arr[i]>arr[j]) {
                                int temp = arr[i];
                                arr[i] = arr[j];
                                arr[j] = temp;
                                }
                        }
                }
        }

回复 使用道具 举报
数组默认从零开始计算,数组第一个数是arr[0],最后一个元素是arr[arr.length-1].
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马