标题:len-1-i,为什么要减i。减一不是也对吗
只看楼主
Ycx0721
Rank: 1
等 级:新手上路
帖 子:28
专家分:7
注 册:2021-10-15
结帖率:42.86%
 问题点数:0 回复次数:5 
len-1-i,为什么要减i。减一不是也对吗
#include <stdio.h>
void bubble_sort(int arr[], int len) {
    int i, j, temp;
    for (i = 0; i < len - 1; i++)
        for (j = 0; j < len - 1 - i; j++)//这一行有问题
            if (arr[j] > arr[j + 1]) {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
}
int main() {
    int arr[] = { 22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70 };
    int len = (int) sizeof(arr) / sizeof(*arr);
    bubble_sort(arr, len);
    int i;
    for (i = 0; i < len; i++)
        printf("%d ", arr[i]);
    return 0;
}
搜索更多相关主题的帖子: i++ int sizeof for temp 
2021-11-24 13:26
apull
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:三体星系
等 级:版主
威 望:185
帖 子:1404
专家分:8479
注 册:2010-3-16
得分:0 
循环是挑大的往后面放,-i是为了减少计算量。
不加-i每次都会遍历整个数组。
2021-11-24 14:08
Ycx0721
Rank: 1
等 级:新手上路
帖 子:28
专家分:7
注 册:2021-10-15
得分:0 
回复 2楼 apull
感谢感谢
2021-11-24 14:10
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
当 i == 0 时
for (j = 0; j < len-i; j++) 也就是 for( j=0; j<len; ++j )
当 j == len-1 时
if( arr[j] > arr[j+1] )  也就是 if( arr[len-1] > arr[len] )
arr[len] 越界了
2021-11-24 14:20
diycai
Rank: 8Rank: 8
等 级:贵宾
威 望:19
帖 子:147
专家分:895
注 册:2021-5-18
得分:0 
为什么叫冒泡? 就因为每轮内部循环后, 都有一个期望值放在了正确的位置上。
例如4 3 2 1在第一轮后,最大的4已经放在了末尾。
第二轮, 4不需要再参与了, 只用比较前3个就可以了, 当然你非要参与也可以,就是多损失一些时间和能量罢了。

有-i,  if (arr[j] > arr[j + 1]) 这条指令的执行次数是 len*(len-1)/2次,
无-i,  if (arr[j] > arr[j + 1]) 这条指令的执行次数是 (len-1)*(len-1)次。

2021-11-24 14:22
Ycx0721
Rank: 1
等 级:新手上路
帖 子:28
专家分:7
注 册:2021-10-15
得分:0 
回复 5楼 diycai
感谢
2021-12-22 20:43



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-507629-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.176543 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved