如何在C中的冒泡排序功能中保持while循环

时间:2018-12-30 04:22:02

标签: c bubble-sort

我正在尝试在C中创建自己的冒泡排序函数。 如您在下面看到的代码所示,我试图仅使用while / if循环来创建此函数。我放了5个数字(1、3、2、5、4),所以它的数组大小为5,我得到了5(我用Python(C)tutor检查了它。但是,直到tab [j ] get3。我想弄清楚,但无法弄清楚为什么tab [j]得到3时,它仍然不停地消失。 有人可以向我解释吗?我会很感激的。

非常感谢您。

以下是我的代码:

#include <stdio.h>

void ft_sort_integer_table(int *tab, int size)
{
    int i;
    int j;
    int tem;

    i = 0;
    j = 0;
    while(tab[i] < size)
    {
        if(tab[j] > tab[j+1])
        {
            tem = tab[j];
            tab[j] = tab[j+1];
            tab[j+1] = tem;
            printf("%d ", tab[j]);
            j++;
        }
        else if(tab[j] < tab[j+1])
        {
          printf("%d ",tab[j]);
          j++;
        }
        i++;
    }
}

int main(void)
{
    int tab[] = {1,3,2,5,4};
    int size = sizeof(tab)/sizeof(*tab);
    ft_sort_integer_table(tab, size);
    return(0);
}

2 个答案:

答案 0 :(得分:2)

您需要在气泡排序中使用一个内部循环,该循环负责将最大的元素向后移动并进行i次交换(这些大元素在“冒泡”)。在每次迭代的0处开始内循环,并迭代size - i(我们知道最后的i个元素已排序并处于其最终位置)。

i控制着您的外部循环,应该在循环结束时递增(就像使用for循环一样)。 j控制内部循环,应在循环结束时递增。

在使用时,将打印移出排序功能是个好主意,这会导致不必要的side effect并可能使调试工作受挫。

此外,值得一提的是(1)for循环在语义上更合适,(2)通过添加布尔值可以进行优化-一旦您通过了内部循环,不执行任何交换,提早结束!

#include <stdio.h>

void ft_sort_integer_table(int *tab, int size)
{
    int i = 0, j, tem;

    while (i < size)
    {
        j = 0;

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

            j++;
        }

        i++;
    }
}

int main(void)
{
    int tab[] = {1,3,2,5,4,6,7,1,5,6,8,9,1,4,5,1,2};
    int size = sizeof(tab) / sizeof(*tab);
    ft_sort_integer_table(tab, size);

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

    return(0);
}

输出:

1 1 1 1 2 2 3 4 4 5 5 5 6 6 7 8 9    

Try it!

答案 1 :(得分:0)

  

我正在尝试找出原因,但无法找出原因   tab [j]变成3时熄灭。

从上面的代码中,j以与i相同的方式递增。这意味着两个变量将具有相同的值,因为在if-then-else语句之后j将j递增1,并且在每个循环结束时i还将i递增1。因此,tab [j]引用的值与tab [i]

相同

话虽如此,while循环中的布尔条件检查tab [i]中的值是否小于size的值。

当i == 3时,tab [i] == 5,因为在循环中,只有索引数组中小于i的值才被交换/更改。由于size变量的值为5,所以tab [i]

有关气泡排序的更多信息,请参见https://www.geeksforgeeks.org/bubble-sort/