我的程序需要从命令行读取数组的大小,然后应使用随机数填充数组。然后,它应该显示数组的排序和未排序内容。
创建了一个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
答案 0 :(得分:2)
因为您正在尝试在初始化数组之前对其进行连续排序。另外,当j == SIZE-1
时,您有未定义的行为,因为此时比较array[j] > 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";
}
答案 1 :(得分:1)
直接的问题是,即使在数组未完全初始化之前,您的代码仍在尝试对数组进行排序。
您需要将主循环分为三个部分:
另外,您还需要仔细考虑循环的边界条件。