簡體   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