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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吃肉的小浣熊 中级黑马   /  2013-5-26 20:47  /  2192 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

int[] a = new int[5] {4,3,5,1,2};
             int temp = 0;
             int i,j;
             for (j = 0; j< a.Length; j++)
                 for (i = 0; i < a.Length - j - 1; i++)//这里的a.Lengeth-j-1为什么还要在-1??
                 {
                     if (a[i] > a[i+1])
                     {
                         temp = a[i];
                         a[i] = a[i + 1];
                         a[i + 1] = temp;
                     }
                 }
              for (int m = 0; m < a.Length; m++)
            {

                Console.WriteLine(a[m]);
a.Lengeth-j-1为什么还要在-1??

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

6 个回复

倒序浏览
因为你下面有个a[i+1]
当你j=0的时候 ,那么i<a.Length-1 也就是说i最大=a.Length-2;
那么i+1最大也才a.Length-1
如果a.Lengeth-j-1这里不-1的话 下面a[i+1]会发生数组越界

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
当你吧倒数第二个数和最后一个数的比较搞定后你还需要去排最后一个数么。。。。
并且如果你表示我蛋疼我想去排的话还会产生程序上一个查询位置越界的问题
注意你 a[i]=a[i+1]段代码
如果你不-1 a[i]已经是数组最后一个数了你a[i+1]就会报错了

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
a.Lengeth-j-1为什么还要在-1??  是为了a[i + 1] 的时候 越界。。比如说  你有 3个 元素,  j=0的时候   i+1 可能变成 a[4]越界  
回复 使用道具 举报
冒泡排序的大体思路就是将相邻的两个数经行比较,将小的数调到所要排序的数最前面。
比如:要将如下的一组数(9 8 5 4 2 0)进行从小到大的顺序经行排序。
则第一次拿着第一个数9与第二个数8经行比较,由于9比8大则需要将8和9对调位置(8 9 5 4 2 0);第二次拿着第一次已经经行过对调了顺序的队列中的第二个数9与第三个数5经行比较,由于9比5大则需要再次将8和9对调位置(8 5 9 4 2 0 )…… 如此共进行5次比较,得到的最后的顺序为8 5 4 2 0 9 。可以看见,最大的数字9已经排在了队列的最后。通过了第一趟(共5次的比较)后,已经得到了最大的数字(9)。然后再将前面的5个数字按照第一趟的方法经行第二趟的比较。可以知道经过4次的比较与对调,得到了次大的数(8)。由此可知归纳的到:按照这种比较方法对6个数字至少要比较5趟,才能将6个数字按大小顺序排列。在第一趟中两个数之间要经行5次的比较,第二趟中两个数字要经行4次的比较……第五趟中两个数字要经行1次的比较。
第一趟的比较图如下:

第2、3、4、5趟的比较与第一趟的类似,只是参与比较的元素依次减少一个。
        由以上的分析可知:n个数要经行冒泡排序,则要经行n-1趟比较,在第一趟比较中要经行n-1次的两两比较,在第j趟比较中要经行n-j-1次两两的比较。
则冒泡排序的一般程序可写为:

void bubbleSort(int n )//n为要比较的数的个数
{
        int temp = 0;
        int i , j;
        for( j = 0; j < n-1; j++)
                for(i = 0; i < n-j-1; i++)
                        if(a[i] > a[i+1])//a[i]、a[i+1]为所要比较的数组中的元素       
{
                                temp = a[i];
                                a[i] = a[i+1];
                                a[i+a] = temp;
}
}
楼主的两个for循环:
    for (j = 0; j< a.Length; j++)
                 for (i = 0; i < a.Length - j - 1; i++)//这里的循环次数为a.Length-j-1,是为了防止数组的角标越界。
其实你的第一个for循环的次数就可以设置为a.Length-1这样就可以减少一趟的比较,从而提高程序的效率。
如果以上的分析有不妥的地方请大家指出,大家彼此相互学习共同进步!谢谢

无标题.png (10.28 KB, 下载次数: 0)

无标题.png
回复 使用道具 举报
冒泡排序的大体思路就是将相邻的两个数经行比较,将小的数调到所要排序的数最前面。
比如:要将如下的一组数(9 8 5 4 2 0)进行从小到大的顺序经行排序。
则第一次拿着第一个数9与第二个数8经行比较,由于9比8大则需要将8和9对调位置(8 9 5 4 2 0);第二次拿着第一次已经经行过对调了顺序的队列中的第二个数9与第三个数5经行比较,由于9比5大则需要再次将8和9对调位置(8 5 9 4 2 0 )…… 如此共进行5次比较,得到的最后的顺序为8 5 4 2 0 9 。可以看见,最大的数字9已经排在了队列的最后。通过了第一趟(共5次的比较)后,已经得到了最大的数字(9)。然后再将前面的5个数字按照第一趟的方法经行第二趟的比较。可以知道经过4次的比较与对调,得到了次大的数(8)。由此可知归纳的到:按照这种比较方法对6个数字至少要比较5趟,才能将6个数字按大小顺序排列。在第一趟中两个数之间要经行5次的比较,第二趟中两个数字要经行4次的比较……第五趟中两个数字要经行1次的比较。
第一趟的比较图如下:

第2、3、4、5趟的比较与第一趟的类似,只是参与比较的元素依次减少一个。
        由以上的分析可知:n个数要经行冒泡排序,则要经行n-1趟比较,在第一趟比较中要经行n-1次的两两比较,在第j趟比较中要经行n-j-1次两两的比较。
则冒泡排序的一般程序可写为:

void bubbleSort(int n )//n为要比较的数的个数
{
        int temp = 0;
        int i , j;
        for( j = 0; j < n-1; j++)
                for(i = 0; i < n-j-1; i++)
                        if(a[i] > a[i+1])        //当数组中前一个值大于后一个值的时候通过中间变量temp将两个数的位置进行调换
{
                                temp = a[i];
                                a[i] = a[i+1];
                                a[i+a] = temp;
}
}
回复 使用道具 举报
1、数组下标在最后一次循环时会越界
2、在排序的过程中已经将最大(最小)的排到后面,最后一个就不需要再循环一次了,效率
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马