冒泡排序法为什么第二个循环要用n-1-i?

在使用冒泡排序法的时候外循环的条件是i就像这个代码,里面的n为9,n-1-i为8-i,是什么意思呢?

img

可以这样理解,一次冒泡排序(假设为升序)会让最大的值上升到数组的末位,这个位置已经是对的了,下一次就不需要再考虑与这个值比较,进行j次后,已经有j的值按正确的升序排列在数组尾部,那么下一趟排序就只用到N-1-j

因为你数组初始只有9个数,如果是9-i的话,下面的比较中的a[j+1]就会越界。比如i=0的时候,如果是j<9-i,那么就是j<9,j的最大值可以是8 ,那么a[j+1]就会是a[9],对于只有9个有效数的数组来说,a[9]是越界的。虽然你的数组定义长度为10,不会越界报错,但a[9]是个随机数,参与排序肯定会出问题。

回答:首先呢,咱先注意几个问题,一是代码格式的问题,换行和括号要加上的,二是主函数可以将几个小功能拆分为几个函数,这样逻辑更清晰一些,最后是冒泡函数的说明了,里面的 j 表示后面还没有排序的数字的下标,因为它采用的是将大的数字(也可以是小的数字)换到最后面去,代码如下(我自己以前写的)

#include <stdio.h>

#define MAX_SIZE 20
typedef int Type;

void printArr(Type arr[], int length)
{
    int i;
    for (i = 0; i < length; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

void bubbleSort(Type arr[], int length)
{
    int i, j;
    Type temp;
    for (i = 0; i < length; i++)
    {
        for (j = 0; j < length - i - 1; j++)
        {
            if (arr[j] > arr[j + 1])
            {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }

        printArr(arr, length);
    }
}

int main()
{
    Type arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 10 };
    int length = sizeof(arr) / sizeof(Type);

    bubbleSort(arr, length);
}

外循环控制行数,内循环控制列数特征