【问题标题】:Following Bubble sort not working in C冒泡排序在 C 中不起作用
【发布时间】:2016-12-06 07:46:49
【问题描述】:

我正在编写一个排序函数来在 C 中实现冒泡排序,但它没有对给定的数组进行排序。这是以下代码。我正在使用 void 函数,因此我无法返回数组并且必须在现有数组中进行更改。代码可以很好地编译并运行,但它不会对数组进行排序。

void sort(int values[], int n)
{
    // TODO: implement an O(n^2) sorting algorithm
    for(int i = 0; i < n; i++)
    {
        int sp = 0;
        for(int j = 0; j < n; j++)
        {
            if (values[i] > values[i + 1])
            {
                int first_val = values[i];
                int second_val = values[i + 1];

                values[i] = second_val;
                values[i + 1] = first_val;
                sp = 1;
            }
        }
        if (sp == 0)
        {
            break;
        }
    }
}

【问题讨论】:

  • i 位于n-1 时,您将values[n-1]values[n] 进行比较,并且数组中没有values[n](索引运行0..n-1)。这是未定义的行为,会导致错误的结果。可能还有其他问题,但这是一个需要解决的重要起始问题。

标签: c arrays sorting bubble-sort cs50


【解决方案1】:

您可以通过说values[i] &gt; values[i + 1] 访问values[i + 1]。所以i的自然极限应该是n-1

for(int i = 0; i < n - 1; i++)

【讨论】:

    【解决方案2】:

    在冒泡排序中,第 1 遍进行 n-1 次比较,第 2 遍进行 n-2 次比较,第 3 遍进行 n-3 次比较,依此类推。所以比较的总数将是

    (n-1)+(n-2)+(n-3)+.....+3+2+1
    Sum = n(n-1)/2
    i.e O(n2)
    

    因此,您需要在代码中更改两件事:-

    1. 内部循环中的条件为 for(j=0;j
    2. 无需使用两个变量来交换数据。冒泡排序的空间复杂度为 O(1),因为临时变量只需要一个额外的内存空间。

    【讨论】:

      【解决方案3】:

      该代码现在似乎可以使用以下代码:

      void sort(int values[], int n)
      {
          // TODO: implement an O(n^2) sorting algorithm
          for(int i = 0; i < n-1; i++)
          {
              int sp = 0;
              for(int j = 0; j < n-1; j++)
              {
                  if (values[j] > values[j + 1])
                  {
                      int first_val = values[j];
                      int second_val = values[j + 1];
      
                      values[j] = second_val;
                      values[j + 1] = first_val;
                      sp = 1;
                  }
              }
              if (sp == 0)
              {
                  break;
              }
          }
      

      }

      【讨论】:

        猜你喜欢
        • 2017-04-03
        • 1970-01-01
        • 1970-01-01
        • 2021-12-30
        • 1970-01-01
        • 2014-03-16
        • 2014-12-30
        相关资源
        最近更新 更多