【问题标题】:Trying to understand bubblesort function试图理解冒泡排序功能
【发布时间】:2017-06-18 07:13:24
【问题描述】:

我对 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

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

【问题讨论】:

  • 此代码不起作用。它从哪里来的?认为它有效的基础是什么?
  • 是的,代码不起作用,因为第二个循环从不迭代。我认为第二个循环中的正确条件是d &lt; n - c - 1

标签: c algorithm for-loop bubble-sort


【解决方案1】:

试试这个代码。

#include<stdio.h>

void sort(int values[], int n)
{
int c,d,t=n;
//if we have n elements then outer loop must iterate for n times.
for(c=0;c<n;c++)
{
    /*after every complete iteration we get a
    sorted element in last position, next iteration
     will be one less, so we assigned value of n into t
     and we will decrease it by 1 after every internal complete iteration.
     */
     for(d=0;d<t-1;d++)
        {
          if(values[d]>values[d+1])
            {
               int temp;
               temp = values[d+1];
               values[d+1] = values[d];
               values[d] = temp;
            }
        }
    //decrease the test cases in next iteration,
    //we already have last element sorted.
    t--;
  }
}
int main()
{
  int i;
  int values[]={24,12,2,4,6};
  sort(values, 5);

   for(i=0; i<5; i++)
     {
        printf("%d\n",values[i]);
     }

return 0;
}

根据需要进行更改。

【讨论】:

    【解决方案2】:

    先看看这个QA

    我的功能冒泡排序 C++ 实现可以在包含 cmets 的地方找到。

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

    所以第二个循环应该在&lt;0,n-1-c&gt; 范围内。 if 语句只选择排序是 asc 还是 desc 并在需要时交换元素。

    与大多数气泡排序一样,您在排序完成时忘记停止(上次运行期间不发生交换)

    【讨论】:

      【解决方案3】:

      不要把简单的事情复杂化,你的代码也不起作用试试下面的代码。`

       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;
                      }
                  }
              }
          }`
      

      【讨论】:

      • 嗯,考虑 values[0] 的唯一一次引用是一次,第一次执行 if (values[c] &gt; values[d])。最小值如何存储在values[0] 中?即使是一个简单的 3,2,1 数组?这会以错误的方式“冒泡”。
      • 最小的值将存储在values[0],因为循环for (d = c+1; d &lt; n; d++)在范围[c; n) 的数组并将其放在values[c].
      猜你喜欢
      • 1970-01-01
      • 2021-06-22
      • 2017-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多