【问题标题】:Having trouble sorting my array. Why won't my array sort properly?无法对我的数组进行排序。为什么我的数组不能正确排序?
【发布时间】:2019-10-12 15:22:29
【问题描述】:

我的程序需要从命令行读取数组的大小,然后它应该用随机数填充数组。然后它应该显示数组的已排序和未排序的内容。

创建了一个 for 循环,以便将随机数读入数组并显示未排序的内容。创建了第二个 for 循环嵌套在第一个循环中,以便对数组中的内容进行排序。

#include <time.h>
#include <iostream>
#include <iomanip>
#include <cstdlib>


using namespace std;

int main(int argc, char * argv[], char **env)
{

    int SIZE = atoi(argv[1]);
    int *array = new int[SIZE];



    for(int i = 0; i < SIZE; i++)
    {
        array[i] = rand()% 1000;
        cout << i << ": " << array[i] << "\n";

        for(int j = 0; j < SIZE; j++)
        {
            if(array[j] > array[j + 1])
            {
                swap(array[j], array[j +1]);
            }

            cout << i << ": " << array[i] << "\n";
        }


    }


    return 0;
    }



I expect an output like

0: 350
1: 264
2: 897

0:264
1:350
2:897

I'm getting an output like
0:41
0:41
0:41
0:41
1:46
1:46
1:0
1:0
2:334
2:334
2:334
2:334

【问题讨论】:

  • 一个建议。将用数据填充数组的代码和对数组排序的代码分开。这不会解决您的问题,但会使调试更容易。正如发布的那样,您的程序具有未定义的行为,因为您正在访问尚未正确初始化的数组元素。

标签: c++ arrays sorting


【解决方案1】:

因为您试图在数组初始化之前对其进行连续排序。此外,您在 j == SIZE-1 时有未定义的行为,因为此时比较 array[j] &gt; array[j+1] 是非法的。 array[j+1] 是无效索引。

而不是这个:

for(int i = 0; i < SIZE; i++)
{
    array[i] = rand()% 1000;
    cout << i << ": " << array[i] << "\n";

    for(int j = 0; j < SIZE; j++)
    {
        if(array[j] > array[j + 1])
        {
            swap(array[j], array[j +1]);
        }

        cout << i << ": " << array[i] << "\n";
    }
}

改为:

   // randomly initialize the array
   for(int i = 0; i < SIZE; i++)
   {
        array[i] = rand()% 1000;
        cout << i << ": " << array[i] << "\n";
   }

   // sort
   for (int i = 0; i < SIZE; i++)
   {
       for(int j = i+1; j < SIZE; j++)
       {
            if(array[i] > array[j])
            {
                swap(array[i], array[j]);
            }
       }
   }

   // print results
   cout << "finished sorting" << endl;
   for(int i = 0; i < SIZE; i++)
   {
        cout << i << ": " << array[i] << "\n";
   }

【讨论】:

  • 感谢您的反馈,非常感谢。它现在可以工作了:))
【解决方案2】:

直接的问题是,您的代码甚至在数组完全初始化之前就尝试对其进行排序。

您需要将主循环分成三个:

  • 第一个初始化数组;
  • 对数组进行排序的第二个(这将包括冒泡排序使用的内部循环);
  • 第三个打印结果。

另外,您还需要仔细考虑循环的边界条件。

【讨论】:

  • 非常感谢您的帮助,现在完美运行。编程的艺术肯定是蜜蜂的膝盖
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-21
  • 1970-01-01
相关资源
最近更新 更多