C 冒泡排序最大值变为0
C Bubble Sort Biggest Value Turns into 0
我不是专业人士,所以请耐心等待。
我正在学习 C,为了练习我做了一个小程序,它从 argv
中读取几个数字,并按升序对它们进行排序。
到目前为止它运行良好。除了两件事:
- 程序在列表中添加了一个额外的零(我知道为什么会这样,但现在不想修复它)
- 最大的数字在这个过程中不知何故变成了零(我不知道为什么会这样,我想修复它)
我特别关注问题 #2。
例如,当 运行ning ./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 values
仍然 returns sort
启动时的正确值。当我在 flip
中时出现问题。仍然不确定问题出在哪里...
您的主要问题是您需要将值存储在从 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。
我不是专业人士,所以请耐心等待。
我正在学习 C,为了练习我做了一个小程序,它从 argv
中读取几个数字,并按升序对它们进行排序。
到目前为止它运行良好。除了两件事:
- 程序在列表中添加了一个额外的零(我知道为什么会这样,但现在不想修复它)
- 最大的数字在这个过程中不知何故变成了零(我不知道为什么会这样,我想修复它)
我特别关注问题 #2。
例如,当 运行ning ./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 values
仍然 returns sort
启动时的正确值。当我在 flip
中时出现问题。仍然不确定问题出在哪里...
您的主要问题是您需要将值存储在从 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。