C气泡排序的最大值变为0

时间:2018-07-27 20:35:07

标签: c bubble-sort

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

我正在学习C,为了练习,我制作了一个小程序,该程序从argv中读取几个数字,并按升序对它们进行排序。

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

  1. 程序在列表中添加了一个额外的零(我知道为什么会这样,但现在不想修复它)
  2. 在此过程中,最大的数字以某种方式变为零(我不知道为什么会这样,我想解决这个问题)

我特别关注问题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运行该程序后,我发现问题不在主函数中,因为x/6uh valuessort启动时仍返回正确的值。我在flip内部时,会发生此问题。仍然不确定是什么问题...

1 个答案:

答案 0 :(得分:0)

您的主要问题是,您需要将值存储在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无关。