在用户输入每个数组位置的值时订购数组

时间:2019-03-28 23:57:06

标签: c

我正在尝试在用户输入数组值时对数组的值进行排序。

问题是我想避免尝试使用“冒泡”或“快速排序”方法。

这是我的代码及其工作方式:

int i, j, k;
      int number;
      for (i = 0; i < size; i = i + 1) {
          printf("Give me the number #%d to add to the list: ", i + 1);
          while (!scanf("%d", &list[i])) {
            while(getchar() != '\n');
            printf("You can't use chars!.\n");
            printf("Give me the number #%d to add to the list: ", i + 1);
          }
          number = list[i];
          if (number < list[i-1]) {
            list[i-1] = list[i];
            list[i] = number;
          }
      }
      for (i = 0; i < size; i = i + 1) {
        printf("%d,", list[i]);
      }

我会得到什么:

How much numbers do you want to order? 5
Give me the number #1 to add to the list: 5
Give me the number #2 to add to the list: 4
Give me the number #3 to add to the list: 3
Give me the number #4 to add to the list: 2
Give me the number #5 to add to the list: 1
4,3,2,1,1,% // here is the problem, the expected output should be: 1,2,3,4,5 (for example, if I have 5,8,3,2,9 I should get: 2,3,5,8,9).

我希望能得到有关为什么我的代码无法正常工作的解释,并可能提出有关将来如何可视化此类问题的建议。

预先感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

如果要避免冒泡排序或插入排序,只需在每次输入后调用合并排序即可。那将使整个程序成为O(x * nlogn),其中n log n是合并排序的运行时间,x是输入循环的运行时间。

当前实现的问题在于,它无法正确排序其余元素。想象一下:

user inputs 2 --> array now has = [2]
user inputs 7 --> array now has = [2, 7] 
user inputs 3 --> array now has = [2, 3, 7]

您看到这个数组如何将3放在2和7的中间吗?这意味着排序还必须将所有元素移到右侧。

您当前的实现不执行此操作。相反,您的实现只将元素从左侧移到右侧一次。

更糟糕的是,您的实现受到输入循环的限制。这意味着您仅在非常特定的局部范围内对数组进行排序,该范围受输入循环的限制。在数组实际范围内,而不是对数组进行排序。

如果用户输入以下数字会发生什么:2、7、4、1?您的循环不在第一个索引中,因此仅将1与值7和4进行比较。

答案 1 :(得分:0)

要使数组保持排序,您应该对每个输入数字进行(部分)插入排序。

只是让您想起了插入排序算法,它对第i次迭代执行以下操作:

  1. 数组从索引0到索引i-1排序
  2. 您有一个新号码,列出[i]。
  3. 您应确定此新数字在数组中的适合位置,以便将数字向后移动,直到看到新数字适合的位置。
  4. 一旦您看到一个不大于新数字的数字,现在就可以在该数字之后插入新的数字。

您的代码存在问题,就是您的移位不正确。

您必须将大于新数字的所有数字向后移动,以便为新数字留出空间。但是您的代码只会移动最后一个数字。

    int i, j, k;
    int number;
    for (i = 0; i < size; i = i + 1)
    {
        printf("Give me the number #%d to add to the list: ", i + 1);
        while (!scanf("%d", &list[i]))
        {
            while (getchar() != '\n')
                ;
            printf("You can't use chars!.\n");
            printf("Give me the number #%d to add to the list: ", i + 1);
        }
        number = list[i];

        /* Here's the point! Shift all numbers bigger than *number* to the back. */
        for (j = i; j > 0 && number < list[j - 1]; j--)
        {
            list[j] = list[j - 1];
        }
        list[j] = number;
    }
    for (i = 0; i < size; i = i + 1)
    {
        printf("%d,", list[i]);
    }

(请重新格式化,这只是我的IDE所做的事情。)