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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 潘龙旺 中级黑马   /  2013-6-26 23:09  /  1466 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

static void Sort(int[] array)
        {
            int length = array.Length;
            for (int i = 0; i < length - 1; i++)
            {
                for (int j = 0; j < length - 1 - i; j++)
                {
                    if (array[j] > array[j + 1])
                    {
                        int temp = array[j];
                        array[j] = array[j + 1];
                        array[j + 1] = temp;
                    }
                }
            }
        }
里面的for循环的j < length - 1 - i中的length - 1 - i是什么意思,请解释一下?

评分

参与人数 1技术分 +1 收起 理由
杞文明 + 1

查看全部评分

5 个回复

倒序浏览
每次内循环需要多少次比较大小,才能找出其中的最大值。如:数组array中有10个数,外层循环是总的循环次数,内层循环是找出剩下的数中最大数,比如数组array[6]={2,3,5,7,8,9},你需要循环6次才能排好序,二内层循环是每次需比较的次数,如:array[0]需要和剩下的5个数作比较,array[1]需要和剩下的4个数比较,一次类推,所以用了length-1-i。

评分

参与人数 1技术分 +1 收起 理由
杞文明 + 1

查看全部评分

回复 使用道具 举报
不管比大还是比小,六个数比较五次即可,就像六个数之间有五个加号就能求和一样。用第一个数和第二,第三,第四,第五,第六个数各比一次,,需要五次。确定一个最值放到最前或者最后,再用第二个数和第三,第四,第五,第六,个数互比,只需比较四次。又确定其中一个最值。如此比较,需要五次大循环比,小循环比会依次减少比较次数。
回复 使用道具 举报
楼主这个是冒泡排序法
数组arr


5164289

  0          1           2          3           4          5          6
相邻的两个元素进行比较,如果符合条件就换位...
①arr[0]与arr[1]比较如果arr[0]>arr[1]则交换位置
②arr[1]与arr[2]比较如果arr[1]>arr[2]则交换位置
③arr[2]与arr[3]比较如果arr[2]>arr[3]则交换位置
④arr[3]与arr[4]比较如果arr[3]>arr[4]则交换位置
⑤arr[4]与arr[5]比较如果arr[4]>arr[5]则交换位置
⑥arr[5]与arr[6]比较如果arr[5]>arr[6]则交换位置
第一圈下来后,最大值出现在最后位
然后 省去最后一位的比较
516428
        0               1               2           3                 4               5
......
for(int x=0;x<arr.length-1;x++)
{
for(int y=0;y<arr.length-x-1;y++) //-x 是为了让每一次比较的元素减少 -1避免脚标越界
{
if(arr[y]>arr[y+1])
{
int temp=arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
}
}
回复 使用道具 举报
这是冒泡排序,你先要理解冒泡排序的算法啊!
首先把第一个元素与第二个元素进行比较(如果第一个大交换),那么这时候是这样的1, 3, 9, -10, 8, 0;接着再把第二个元素与第三个进行比较,这时候
1, 3, 9, -10, 8, 0(元素的位置并没有变);接着多次比较,最后9跑到最后了1, 3, -10, 8,  0, 9。
但是,这还没完要接着第二趟进行比较:……
int[] arr = new int[] {3, 1, 9, -10, 8, 0};

外层循环是控制趟数,内层循环是控制比较的次数。每一趟完后,最大数就往后排,因此内层循环比较的次数应该要减少(没必要再比较后面的了)。那么仔细观察,这个次数与x刚好相反(x增加,次数就减少)。
回复 使用道具 举报
int[] numbers={9,8,7,6,5,4,3,2,1,0};  改成升序排列 0 1 2 3 4 5 6 7 8 9   4 5 6 78 9 89 45 2 1
第一趟  8 7 6 5 4 3 2 1 0 9  第一趟比较了9次    i=0 j=9     numbers.Length-1;
第二趟  7 6 5 4 3 2 1 0 8 9  第二趟比较了8次    i=1 j=8     numbers.Length-1-1;
第三趟  6 5 4 3 2 1 0 7 8 9  第三趟比较了7次    i=2 j=7            numbers.Length-1-2;       
第四趟  5 4 3 2 1 0 6 7 8 9  第四趟比较了6次    i=3 j=6     numbers.Length-1-3
第五趟  4 3 2 1 0 5 6 7 8 9  第五趟比较了5次    i=4 j=5
第六趟  3 2 1 0 4 5 6 7 8 9  第六趟比较了4次    i=5 j=4
第七趟  2 1 0 3 4 5 6 7 8 9  第七趟比较了3次    i=6 j=3
第八趟  1 0 2 3 4 5 6 7 8 9  第八趟比较了2次    i=7 j=2
第九趟  0 1 2 3 4 5 6 7 8 9  第九趟比较了1次    i=8 j=1

for(int i=0;i<number.Length-1;i++)
{
        for(int j=0;j<numbers.Length-1-i;j++)
        {
                if(numbers[j]>numbers[j+1])
                {
                        int temp=numbers[j];
                        numbers[j]=numbers[j+1];
                        numbers[j+1]=temp;
                }
        }
}

讲得详细吧,多给点技术分吧
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马