注册 登录
编程论坛 C语言论坛

len-1-i,为什么要减i。减一不是也对吗

Ycx0721 发布于 2021-11-24 13:26, 1690 次点击
#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;
}
5 回复
#2
apull2021-11-24 14:08
循环是挑大的往后面放,-i是为了减少计算量。
不加-i每次都会遍历整个数组。
#3
Ycx07212021-11-24 14:10
回复 2楼 apull
感谢感谢
#4
rjsp2021-11-24 14:20
当 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] 越界了
#5
diycai2021-11-24 14:22
为什么叫冒泡? 就因为每轮内部循环后, 都有一个期望值放在了正确的位置上。
例如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)次。

#6
Ycx07212021-12-22 20:43
回复 5楼 diycai
感谢
1