C 冒泡排序最大的值变成0

Posted

技术标签:

【中文标题】C 冒泡排序最大的值变成0【英文标题】:C Bubble Sort Biggest Value Turns into 0 【发布时间】:2018-07-27 20:35:07 【问题描述】:

我不是专业人士,所以请多多包涵。

我正在学习C,为了练习,我做了一个小程序,从argv读取几个数字,并按升序排序。

到目前为止,它运行良好。除了两件事:

    程序在列表中添加了一个额外的零(我知道为什么会这样,但现在不想修复它) 在这个过程中,最大的数字不知何故变成了零(我不知道为什么会发生这种情况,我想修复它)

我特别关心问题 #2。

例如,当运行 ./a.out 6 8 4 9 3 时,输出会输出到 0 0 3 4 6 8 而不是 0 3 4 6 8 9(我再次只关心 9 的消失)

如果有帮助,我在 Linux 上使用 gcc 版本 7.3.1。

为什么最大的数会变成零?

代码:

#include <stdio.h>
#include <stdlib.h>

void flip(short position, short * values)
    int key = values[position];
    values[position] = values[position + 1];
    values[position + 1] = key;



void sort(short * values, short argc)
    for( short iterations = argc; iterations > 0; --iterations)
            for( short position = 1; position < iterations; ++position)
                    if (values[position] > values[position + 1])
                            flip(position, values);
            
    

    for ( short i = 0; i < argc; ++i )
            printf("%d ", values[i]);
    printf("\n");


int main(short argc, char **argv)
    if ( argc <= 1 )
            fprintf( stderr, "USAGE: %s <<short int>...>\n", argv[0] );
            return 1;
    

    short *values = malloc(sizeof(short) * (argc-1));

    for (int i = 1; i < argc; ++i ) 
            values[i] = strtol(argv[i], NULL, 0);
    

    sort(values, argc);

    return 0;

任何帮助将不胜感激。

编辑:通过 GDB 运行它后,我发现问题不在主函数中,因为当 sort 启动时,x/6uh values 仍然返回正确的值。当我在flip 内时,就会出现问题。不过还是不知道是什么问题...

【问题讨论】:

借此机会learn how to debug your programs。 然而,一个好的开始是考虑realloc 返回 既然知道argc的大小,为什么还要realloc呢?为什么不只做一个 malloc(sizeof(short)*argc)? 使用gdb 很好,但您的编辑听起来好像您认为您已经从中获得了一切。我确信事实并非如此。但是,现在您知道将注意力(在 gdb 中)集中在 sort 函数上。 你知道 C 中的数组从位置 0 开始吗​​? 【参考方案1】:

您的主要问题是您需要将值存储在从 values[0] 开始的数组中,并且您错误地使用太大的 argc 调用您的排序例程。试试这样的:

#include <stdio.h>
#include <stdlib.h>

void flip(int position, int * values)
    int key = values[position];
    values[position] = values[position + 1];
    values[position + 1] = key;



void sort(int * values, int numvals)
    for( int iterations = numvals - 1; iterations >= 0; --iterations) //TODO
            for( int position = 0; position < iterations; ++position)
                    if (values[position] > values[position + 1])
                            flip(position, values);
            
    

    for ( int i = 0; i < numvals; ++i )
            printf("%d ", values[i]);
    printf("\n");


int main(int argc, char **argv)
    if ( argc <= 1 )
            puts("Did not specify any arguments. Exiting...");
            return 1;
    

    int *values = malloc(sizeof(int) * (argc-1));

    for (int i = 1; i < argc; ++i )
            values[i-1] = strtol(argv[i], NULL, 0);
    

    sort(values, argc - 1);

    return 0;

我将你的短裤改为整数,但这可能无关紧要,除了 argc。

【讨论】:

用你的编辑运行它。当给定数字 8 65 9 3 时,它返回 4259840 8 9 3。我不确定,也许你删除了一些东西,但我忘了放回去。 我遗漏了你的 flip 函数,它和你原来的一样工作得很好。 是的,我注意到了,因为没有flip(或标题)就无法编译。不过,我一定是搞砸了别的东西,因为它现在可以工作了。 很高兴你明白了。

以上是关于C 冒泡排序最大的值变成0的主要内容,如果未能解决你的问题,请参考以下文章

请问这个冒泡排序代码,每一行都是啥意思呀,谢谢

冒泡法排序

JavaScript 的冒泡排序

冒泡排序

冒泡排序

冒泡排序(C语言实现)