冒泡排序编程中 j为啥要减1

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了冒泡排序编程中 j为啥要减1相关的知识,希望对你有一定的参考价值。

这里length-1是因为数组的初始角标默认是0,并且
,局部变量int i=0,如果有5个数,虽然他们的长度是5,但是角标是用0~4来表示的,所以,不减去1的话,就会编程0~5,就会多一个数。
// length-1-i内循环里,在这里减去了i,因为,假设为5个数组,从大到小排序,我们在第一趟循环中,已经得到了最小数,并且,在第一趟子内循环结束时,最小数字已经排到了数列末尾,那么,再比较这5个数的大小时其实可以不用去和第五个数字比较,那么角标的长度,就会减去1,为什么是1呢,这里举例说的是第一次循环,也就是,i在传入内循环时,它是i++,也就是,自增了1,i的初始值是0,所以i传入内循环后,值是1,同理可得,当第二轮循环,i进入内循环就是2,第4次,就是4,这样的话,减去i,就也就是减去几次已经循环过的,省略掉已经确定了的数据,这样就可以节约时间,这里可能会奇怪,那第几次减去几是不是错了,别忘了,我们是从的数组角标是从0开始的,内循环i是从1开始的,所以不冲突
参考技术A

    根据自己的业务逻辑写的

    把2层循环的结果都打印出来,并且把i和j都带上,这样可能会理解好

    打印可以使用System.out.println(你的输入内容);

参考技术B // TODO 外面的for循环是趟数,里面的for循环是两两比较的操作
int[] a = 1,3,7,88,44,66;

for(int i = 0;i < a.length;i++)
// TODO 此处-1是为了防止数组下标溢出 a[j+1],若不减一,此处的例子上a[j+1]则会变成a[a.length] 这肯定是不行的。
for(int j = 0;j < a.length-i-1;j++)
if(a[j] > a[j+1])
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;



这会老哥知道了吧
参考技术C 要把数组中的位置移动到前一位进行比较。 参考技术D 请把问题说清楚。什么地方减1?

为啥我们在冒泡排序算法中进行 n-1 次迭代

【中文标题】为啥我们在冒泡排序算法中进行 n-1 次迭代【英文标题】:Why do we make n-1 iterations in bubble sort algorithm为什么我们在冒泡排序算法中进行 n-1 次迭代 【发布时间】:2018-05-11 18:41:28 【问题描述】:

冒泡排序算法最常见的方式是有两个 for 循环。内部从 j=0 到 j n-i-1 完成。我假设我们减去减 i,因为当我们到达最后一个元素时,我们不会比较它,因为我们在他之后没有元素。但是为什么我们使用n-1。为什么我们不从 i=0 到 i

for (int i = 0; i < n - 1; i++) // Why do we have n-1 here?
    
        swapped = false;
        for (int j = 0; j < n - i - 1; j++)
        
            countComparisons++;
            if (arr[j] > arr[j + 1])
            
                countSwaps++;
                swap(&arr[j], &arr[j + 1]);
                swapped = true;
            

        
     

例如,如果我有一个包含 6 个元素的数组,为什么我只需要进行 5 次迭代?

【问题讨论】:

你能解释一下为什么 n-i-1..我挣扎了很多,但没有找到答案..? 【参考方案1】:

因为交换至少需要两个元素。

所以如果你有 6 个元素,你只需要考虑 5 个连续的对。

【讨论】:

我对 n-i-1 的理解正确吗?是否意味着跳过数组中最后一项的比较,因为我们后面没有元素? @CaL17 数组未排序部分的最后一项 非常感谢您提供此信息但如果您还可以解释内部循环中 n-i-1 的逻辑,那将是一个很大的帮助..【参考方案2】:

为了在数组中进行比较,需要两个相邻的单元格;在 6 个元素的数组中,您只进行 5 次比较;在一个包含 10 个元素、9 个比较等的数组中:

array and comparisons between adjacent cells

所以对于 7 个元素,只进行了 6 次比较,因此外层 for 循环中 n-1 的一般规则

关于 n-1-i 表达式,请记住冒泡排序中的最高(或最低,取决于排序标准)值在第一个循环后到达数组中的最后一个位置,所以不需要将该值与其他任何值进行比较,因此数组必须一次“缩短”1个单元格,并且外部循环中 i 的值是负责的计数器在内循环中:

5 | 3 | 9 | 20 |元素 (n) = 4

在第一个循环(i = 0)之后,20 已经到达数组中的正确位置(使用升序),留下一个包含 3 个元素的数组来进行比较;在下一个循环中,i 将等于 1,并且由于 n-1 保持不变,我们需要在该表达式中减去 1 以“缩短”数组: n-1-i = 4-1-1 = 2,这是新数组中最后一个元素的索引以及需要比较的数量。

希望对你有帮助!

【讨论】:

以上是关于冒泡排序编程中 j为啥要减1的主要内容,如果未能解决你的问题,请参考以下文章

为啥冒泡排序没有效率?

java冒泡排序法代码

请编程实现一个冒泡排序算法

JS冒泡排序,快速排序,二分查找

用C语言编写函数,要实现快速排序算法或者冒泡法

为啥我们在冒泡排序算法的内循环中使用 `length-i-1`