仅使用while循环的C中的反向冒泡排序算法

问题描述

我正在尝试创建一个反向冒泡排序算法。它有效,但第一个输出一个我不明白的疯狂数字。剩余的输出似乎按降序排序。我的代码哪里错了?

   #include <stdio.h>

  void ft_rev_int_tab(int *tab,int size)
  {
   int i;
   int j;
    int k;

     i = 0;
     while (i < size) 
   {
     j = 0;
     while (j < size -i) 
      {
         if (tab[j] < tab[j+1]) 
             {
                 k = tab[j]; 
                 tab[j] = tab[j+1]; 
                 tab[j + 1] = k; 
             }
     j++;
   }
 i++;
   }
   }


 int main(void) 
   {
 int tab[] = {9,320,113,15};
  int size = sizeof(tab) / sizeof(*tab);

   ft_rev_int_tab(tab,size);
   for (int i = 0; i < size; i++)
     {
    printf ("%d\n",tab[i]);
   } 
   }

解决方法

i = 0; 之前的

while (i < size) 是错误的。当 j < size -i 为零时,条件 j < size 等效于 i。在这种情况下,j 最多为 size-1,现在 tab[j+1] 超出范围。

应该改为i = 1;

,
void ft_rev_int_tab(int *tab,int size) {
    int i;
    int j;
    int k;

    i = 0;
    while (i < size) {
        j = 0;
        while (j < size - i - 1) {
            if (tab[j] < tab[j + 1]) {
                k = tab[j];
                tab[j] = tab[j + 1];
                tab[j + 1] = k;
            }
            j++;
        }
        i++;
    }
}

您在嵌套 while 循环中的条件应为 (j < size - i - 1) 因为您只需要检查从 tab[0]tab[i-1] 的值。您的 if 和 swap 检查 tab[j]tab[j+1],因此当 i 等于数组的大小时,您会将其与数组外的值进行比较。在您的示例中是 tab[5] 的值。