繁体   English   中英

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

[英]How to keep while loop in bubble sort function in C

我正在尝试在 C 中创建自己的冒泡排序函数。

正如你在下面的代码中看到的,我试图只使用while / if循环来创建这个函数。 我输入了 5 个数字(1,3,2,5,4)所以这个数组的大小是 5,我得到了 5(我用 Python(C)tutor 检查了它。但是,它运行良好,直到tab[j]得到 3。我试图弄清楚,但无法弄清楚为什么当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);
}

您的冒泡排序中需要一个内部循环,它负责将最大的元素移到后面并执行交换i次(这些大元素正在“冒泡”)。 在每次迭代时从0开始内部循环并遍历size - i (我们知道最后i元素已排序并位于它们的最终位置)。

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

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

此外,值得一提的是,(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    

尝试一下!

我试图弄清楚,但无法弄清楚为什么当 tab[j] 获得 3 时它会一直消失。

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

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

当 i == 3, tab[i] == 5 因为在循环中,只有索引数组中小于 i 的值被交换/更改。 由于 size 变量保持该值 5,因此 tab[i] < size 将导致错误值并退出循环。

可以在此处找到有关冒泡排序的更多信息, https://www.geeksforgeeks.org/bubble-sort/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM