【问题标题】:Bubble Sort Algorithm in C – Is this it?C中的冒泡排序算法——是这样吗?
【发布时间】:2020-05-24 01:55:48
【问题描述】:

我目前是一名 CS50x 学生。

我一直在玩弄搜索和排序算法。试图在代码中理解它们。现在,关于冒泡排序的主题:我创建了我认为是冒泡排序算法。但是我不太适合需要将交换计数设置为非零值的想法。我的算法(如下)确实对所有数字进行了排序。不过,我在哪里适合交换想法?如果有人能这么好心地解释一下,我将不胜感激。


#import <stdio.h>
#import <cs50.h>

int main(void)
{

    // Creating an unsorted array

    int count = 10;

    int array[count];

    for (int z = 0; z < count; z++)
        scanf("%i", &array[z]);


    // Bubble Sort

    int buffer;

    for (int b = 0; b < count; b++)
    {

        int a = 0;

        while (a < count)
        {
            if (array[a] > array[a+1])
            {
                buffer = array[a];
                array[a] = array[a+1];
                array[a+1] = buffer;
            }
            a++;
        }

    }

    printf("Sorted: ");

    for (int b = 0; b < count; b++)
        printf("%i ", array[b]);

    printf("\n");

}


【问题讨论】:

  • 您是否看到您的代码中有任何可以被描述为“交换”两件事的部分?
  • 您的内部while 应该是for 考虑到您的使用方式:for (int a = 0; a &lt; count; ++a)
  • 提示:注意不要离开数组的末端,如a + 1必须是count。
  • 代码中buffer 用于在两个单独的数组索引处交换 值的部分——看起来很像swap 算法。 该代码之前,array[a]array[a+1] 中的内容是什么? 该代码之后array[a]array[a+1] 中的内容是什么?

标签: c bubble-sort cs50


【解决方案1】:

指令是#include,而不是#import。计算交换次数的想法是,如果没有任何内容不符合顺序,则中断外循环(因为内循环中不需要交换)。这段代码实现了:

#include <stdio.h>

int main(void)
{
    // Creating an unsorted array
    int count = 10;
    int array[count];

    for (int z = 0; z < count; z++)
        scanf("%i", &array[z]);

    putchar('\n');
    printf("%8s:", "Unsorted");
    for (int b = 0; b < count; b++)
        printf(" %i", array[b]);
    printf("\n");

    // Bubble Sort
    for (int b = 0; b < count; b++)
    {
        int a = 0;
        int num_swaps = 0;

        while (a < count - 1)
        {
            if (array[a] > array[a+1])
            {
                int buffer = array[a];
                array[a] = array[a+1];
                array[a+1] = buffer;
                num_swaps++;
            }
            a++;
        }
        if (num_swaps == 0)
            break;
    }

    printf("%8s:", "Sorted");
    for (int b = 0; b < count; b++)
        printf(" %i", array[b]);
    printf("\n");

    return 0;
}

示例运行(源 bs97.c 编译为 bs97;自制随机数生成器 random — 使用的选项生成 10 到 99(含)之间的 10 个数字):

$ random -n 10 10 99 | bs97

Unsorted: 68 47 85 39 52 54 31 81 19 59
  Sorted: 19 31 39 47 52 54 59 68 81 85
$ random -n 10 10 99 | bs97

Unsorted: 75 85 36 11 35 87 59 63 26 36 
  Sorted: 11 26 35 36 36 59 63 75 85 87 
$ random -n 10 10 99 | bs97

Unsorted: 90 27 64 90 76 79 52 46 98 99
  Sorted: 27 46 52 64 76 79 90 90 98 99
$ random -n 10 10 99 | bs97

Unsorted: 53 60 87 89 38 68 73 10 69 84
  Sorted: 10 38 53 60 68 69 73 84 87 89
$

请注意,代码避免在输出中出现尾随空格。

您还可以在排序 for 循环之外定义 int num_swaps = 1; 并在主循环条件下进行测试:

for (int b = 0; b < count - 1 && num_swaps > 0; b++)
{
    num_swaps = 0;

并从循环末尾删除if (num_swaps == 0) break;。内部循环也可以是for 循环。并且外循环的第一个循环将最大值移动到数组的末尾,因此您可以缩短内循环,从而减少工作量。打印代码也应该被考虑到一个函数中。

#include <stdio.h>

static void dump_array(const char *tag, int size, int data[size])
{
    printf("%8s (%d):", tag, size);
    for (int i = 0; i < size; i++)
        printf(" %i", data[i]);
    printf("\n");
}

int main(void)
{
    // Creating an unsorted array
    int count = 10;
    int array[count];

    for (int z = 0; z < count; z++)
    {
        if (scanf("%i", &array[z]) != 1)
        {
            fprintf(stderr, "Failed to read number %d\n", z + 1);
            return 1;
        }
    }

    putchar('\n');
    dump_array("Unsorted", count, array);

    // Bubble Sort
    int num_swaps = 1;
    for (int b = 0; b < count - 1 && num_swaps > 0; b++)
    {
        num_swaps = 0;
        for (int a = 0; a < count - b - 1; a++)
        {
            if (array[a] > array[a + 1])
            {
                int buffer = array[a];
                array[a] = array[a + 1];
                array[a + 1] = buffer;
                num_swaps++;
            }
        }
    }

    dump_array("Sorted", count, array);

    return 0;
}

示例输出:

$ random -n 10 10 99 | bs97

Unsorted (10): 31 82 81 40 12 17 70 44 90 12
  Sorted (10): 12 12 17 31 40 44 70 81 82 90
$

【讨论】:

    猜你喜欢
    • 2018-08-11
    • 2013-07-13
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多