输入负数时排序算法有问题

问题描述 投票:0回答:1

我正在尝试用 C 语言编写代码,对 n 个数字从小到大进行排序。当所有数字都是正数时它工作正常,但当我输入负数时它在第一个索引处返回 0。

下面是我的代码:

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

int main(int argc, char *argv[])
{
    int data[100000]; /* Array of ints to sort */
    int nDataItems;
    if (argc > 1) {
        nDataItems = argc;
        for (int i = 0; i < nDataItems; i++)
            data[i] = atoi(argv[i]);
    } else {
        nDataItems = 4;
        data[0] = 10;
        data[1] = 20;
        data[2] = 30;
        data[3] = 40;
    }
     
    mySort(data, nDataItems);

    for (int i = 0; i < nDataItems - 1; i++) {
        if (data[i] > data[i + 1]) {
            printf("Sorting error at index %d \n", nDataItems);
            exit(1);
        }
    }
  
    printf("Printing Array: \n");

    for (int i = 1; i < nDataItems; i++)
        printf("%d \n", data[i]);
    return 0;
}

这是排序的代码:

void mySort(int d[], unsigned int n)
{
    int x, y;
    for (int i = 0; i < n; i++)
    {
         x = i - 1;
         y = d[i];
         while (x >= 0 && d[x] > y) {
             d[x+1] = d[x];
             x--;
        }
        d[x + 1] = y;
    }
}

据我了解,代码接受负数并将其转换为 0。我怀疑问题出在

atoi
但不确定。 Here is a picture of the terminal when I try testing it.

C:\Users\danes\Desktop\COE428\lab1›testSort2 2 76 33 11 9
Printing Array
2
9
11
33
76

C:\Users\danes\Desktop\COE428\lab1> testSort2 -5 11 29 15 2
Printing Array
0
2
11
15
29
c algorithm sorting terminal
1个回答
0
投票

代码中有2个问题:

  • 您将命令行参数从

    argv[0]
    复制到
    argv[argc - 1]
    ,这是不正确的,因为
    argv[0]
    是程序的名称,而不是命令行参数。数组中的条目比参数多,并且这个初始条目是
    0
    ,因为程序的名称以字母开头。

  • 您从

    i = 1
    而不是
    i = 0
    输出数组,因此您可以在排序后跳过最低的元素。

如果所有参数均为正数,则额外的

0
会排序到最低位置并在输出时跳过,从而隐藏问题,但如果至少有一个负数,则
0
会出现在输出中,并且最低的数字是正如第二个示例中观察到的那样缺失。

两个 bug 相互抵消的典型案例,但并非总是如此。

这是修改后的版本:

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

int main(int argc, char *argv[])
{
    int data[100000]; /* Array of ints to sort */
    int nDataItems;
    if (argc > 1) {
        nDataItems = argc - 1;
        for (int i = 0; i < nDataItems; i++)
            data[i] = atoi(argv[i + 1]);
    } else {
        nDataItems = 4;
        data[0] = 10;
        data[1] = 20;
        data[2] = 30;
        data[3] = 40;
    }
     
    mySort(data, nDataItems);

    for (int i = 0; i < nDataItems - 1; i++) {
        if (data[i] > data[i + 1]) {
            printf("Sorting error at index %d\n", nDataItems);
            exit(1);
        }
    }
  
    printf("Printing Array:\n");

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

    return 0;
}

void mySort(int d[], unsigned int n)
{
    // perform insertion sort
    for (int i = 1; i < n; i++) {
         int y = d[i];
         for (int x = i; x > 0 && d[x - 1] > y; x--) {
             d[x] = d[x - 1];
        }
        d[x] = y;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.