这个冒泡法的问题出在哪里

img

void Swap(int A[], int i, int j)
{
int temp = A[i];
A[i] = A[j];
A[j] = temp;
}

void BubbleSort(int A[], int n)
{
int i,j;
for ( j = 0; j < n - 1; j++) // 每次最大元素就像气泡一样"浮"到数组的最后
{
for ( i = 0; i < n - 1 - j; i++) // 依次比较相邻的两个元素,使较大的那个向后移
{
if (A[i] > A[i + 1]) // 如果条件改成A[i] >= A[i + 1],则变为不稳定的排序算法
{
Swap(A, i, i + 1);
}
}
}
}

int main()
{
int A[] = { 6, 5, 3, 1, 8, 7, 2, 4 }; // 从小到大冒泡排序
int n = sizeof(A) / sizeof(int);
BubbleSort(A, n);
printf("冒泡排序结果:");
int i;
for ( i = 0; i < n; i++)
{
printf("%d ", A[i]);
}
printf("\n");
return 0;
}

/*

  • 尽管冒泡排序是最容易了解和实现的排序算法之一,但它对于少数元素之外的数列排序是很没有效率的。
  • /
    你看一下这个代码,可能对你有帮助

有很多问题:

  1. 既然打印了“输入10个数”,却没有从终端读取数组元素个数;
  2. 如果是手动输入数组个数,用固定的a[10]则不太合理,应该用malloc申请动态数组;
  3. j所在的那个循环,j的值变化方式不对,既然j已经初值为9,何来j++,并且还判断j < 9 - i?这显然是不对的。一种修改方式是让j初值为1,判断j < 10 - i,j++自增;
  4. 冒泡排序要比较的元素应该是相邻元素a[j]和a[j-1],i是代表要排序的趟数,而非元素下标,j才是代表元素下标的。

可以参考我用C写的一个冒泡排序:

int main()
{
    int n;
    printf("输入数组元素个数:\n");
    scanf("%d", &n);
    if (n <= 0) {
        printf("invalid input array number: %d\n", n);
        exit(1);
    }

    int *a = (int *)malloc(sizeof(int) * n);
    if (!a) {
        printf("memory is not enough\n");
        exit(1);
    }

    for (int i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }
    
    for (int i = 0; i < n - 1; i++) { // n-1趟排序,每一趟移动最大元素值到数组末尾,不再参与下一趟的比较
        for (int j = 1; j < n - i; j++) { // j范围: 1..n-i-1, j-1范围: 0..n-i-2; 
                                          // 极端情况:1) i = 0; 2)i = n - 2, 再看j和j-1是否能取到边界
            if (a[j - 1] > a[j]) { // swap a[j-1], a[j]
                int temp = a[j - 1];
                a[j - 1] = a[j];
                a[j] = temp;
            }
        }

    }
    free(a);
    return 0;
}