冒泡后排序不能在C中工​​作

时间:2016-12-06 07:46:49

标签: c arrays sorting bubble-sort cs50

我正在编写一个sort函数来实现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;
        }
    }
}

3 个答案:

答案 0 :(得分:3)

您可以通过values[i + 1]来访问values[i] > values[i + 1]。因此i的自然限制应为n-1

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

答案 1 :(得分:2)

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

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

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

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

答案 2 :(得分:0)

现在代码似乎正在使用以下代码:

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

}