试图了解bubblesort功能

时间:2017-06-18 07:13:24

标签: c algorithm for-loop bubble-sort

我对C和编程很新,我有一个关于循环以下冒泡排序函数的问题:

    void sort(int values[], int n);
    {
        int c, d, t;

        for (c = 0; c < (n - 1); c++)
        {
            for (d = 0; d < c - n - 1; d++)
            {
                if (values[d] > values[d + 1])
                {
                    t = values[d];
                    values[d] = values[d + 1];
                    values[d + 1] = t;
                }
            }
        }
    }

我特意试图理解的部分是第二个for循环:

    for (d = 0; d < c - n - 1; d++)

据我所知,该函数每次都在遍历数组,比较并排值直到最后一个排序元素,并将最大元素冒泡到数组末尾;但是,我似乎无法理解:

    while d < c - n - 1;

以及它如何翻译。当我在脑海里玩这个时,我想象在第一次循环时,d&lt; c-n-1等于0 <1。 0 - 10 - 1.在我看来,由于c总是小于n - 1,从c减去n - 1总是会得到一个小于0的值,而d永远不会小于0所以永远不应该执行。我知道我只是看着这个错误而且可能会有一个&#39; duh&#39;提出答案的那一刻,但这困扰着我。

如果我将第一个for循环放入单词中,它会说:当c小于数组的长度时,执行此循环的内容然后递增c。有人可以用类似的方式将第二个for循环放入单词中,解释d&lt; c - n - 1?

3 个答案:

答案 0 :(得分:0)

首先看一下 QA

我的功能性冒泡排序 C ++ 实现可以在包含注释的情况下找到。

你的第一个循环应该循环冒泡排序每次少一个数组大小,因为数组中的最后一个值已经从上一次运行中排序。

所以第二个循环应该在<0,n-1-c>范围内。 if语句只会选择排序是 asc 还是 desc 以及交换元素(如果需要)。

像大多数泡泡那样排序你忘记在排序完成时停止(在上次运行期间没有交换)

答案 1 :(得分:0)

请尝试使用此代码。

SpreadSheet

根据您的需要进行更改。

答案 2 :(得分:-1)

不要让简单的事情变得复杂,而且你的代码也不行,请尝试以下代码。

 void sort(int values[], int n);
        {
            int c, d, t;
// since c is intitalised to 0 u can simply use n
        for (c = 0; c < n; c++)
        {
//Assign d = c+1 instead of doing it in next step
           for (d = c+1; d < n; d++)
            {
//It is ascending sort it checks first and second value ,if greater it will swap
                if (values[c] > values[d])
                {
                    t = values[c];
                    values[c] = values[d];
                    values[d] = t;
                }
            }
        }
    }`