排序阵列的麻烦
Trouble with sorting array
#include "stdafx.h"
#include <iostream>
#include <math.h>
#include <time.h>
#include<iomanip>
#include<array>
#include <algorithm>
using namespace std;
const int AS = 6;
void FillingRandomly(int [AS][AS]);
void printing(int[AS][AS]);
void forsorting(int[][AS], int);
int c;
int main()
{
int funny = 0;
int timpa = 0;
int counter = 0;
int Array[AS][AS];
srand(time(0));
FillingRandomly(Array);
cout << "The unsorted array is" << endl << endl;
printing(Array);
cout << "The sorted array is" << endl << endl;
forsorting(Array, funny);
printing(Array);
system("PAUSE");
return 0;
}
void FillingRandomly(int Array[AS][AS])
{
for (int i = 0; i<AS; i++)
{
for (int j = 0; j<AS; j++)
Array[i][j] = rand()%87 +12;
}
}
void printing(int Array[AS][AS])
{
int counter = 0;
for (int i = 0; i<AS; i++)
{
for (int j = 0; j<AS; j++)
{
cout << setw(5) << Array[i][j];
counter++;
if (counter%AS == 0)
cout << endl << endl;
}
}
}
void forsorting(int Array[AS][AS], int funny)
{
int w=0;
int dice = 0;
int Brray[AS*AS];
int super = 0;
int space=0;
//Transofrming Array[][] into Brray[]
for (int i = 0; i < AS; i++)
{
for (int k = 0; k < AS; k++)
{
Brray[space] = Array[k][i];
space++;
}
}
//Bubble sorting in Brray[]
for (int passer = 0; passer < AS-1; passer++)
{
for (int timpa = 0; timpa < AS-1; timpa++)
{
if (Brray[timpa]>Brray[timpa + 1])
{
super = Brray[timpa];
Brray[timpa] = Brray[timpa + 1];
Brray[timpa + 1] = super;
}
}
}
//Transforming Brray[] into sorted Array[][]
for (int j=0;j<AS;j++)
for (int i=0;i<AS;i++)
{
Brray[w]=Array[i][j];
}
w++;
}
好的,这是我的代码。我需要做的就是分类部分,我写了泡泡排序技术,我仔细检查了我的课程,这是相同的逻辑。所以我想知道的是为什么当我在屏幕上打印出我的阵列。
谢谢您的帮助
这个
Brray[w]=Array[i][j];
是错误的方式。
您从来没有真正写入数组。
您遇到的问题之一是,在实现气泡排序算法而不是AS*AS
时,您假设总尺寸为AS
。此外,您的实现甚至无法检查何时已经对数组进行排序,从而导致不必要的比较操作。尝试以下操作:
//Bubble sorting in Brray[]
bool sorted;
int len = AS*AS-1;
do
{
sorted = true;
for (int timpa = 0; timpa < len; timpa++)
{
if (Brray[timpa]>Brray[timpa + 1])
{
super = Brray[timpa];
Brray[timpa] = Brray[timpa + 1];
Brray[timpa + 1] = super;
sorted = false;
}
}
len--;
} while (!sorted);
此外,当将内容移回2D数组时,您已经切换了分配操作的顺序:
int w = 0;
for (int j=0;j<AS;j++) {
for (int i=0;i<AS;i++)
{
Array[i][j] = Brray[w];
}
w++;
}
我还建议您将程序的逻辑分为更通用,更易于管理的部分:两个功能将2D数组重新解释为1D数组(和VICE-VERSA),另一个用于实际分类。两者都可以接受可变大小的数组,使其适用于同一程序中的更多问题。这也适用于填充随机数的函数。
在C 的情况下,另一个有用的建议是声明有关您需要的变量,而不是在功能开始时将它们堆叠起来。请参阅上面代码中的w
变量。
此代码有很多错误...
首先,您的排序是错误的。这将起作用
for (int i = 1; i <= AS*AS; i++)
for (int j = 0; j < (AS*AS - 1); j++)
if (Brray[j + 1] > Brray[j]) {
int temp = Brray[j];
Brray[j] = Brray[j + 1];
Brray[j + 1] = temp;
}
其次,正如其他人所提到的,您实际上并没有更新2D数组。
for (int j = 0; j < AS; j++)
for (int i = 0; i < AS; i++)
Array[j][i] = Brray[w++];
第三,您可以使用std::sort
,它比气泡排序,更安全,更可靠等要快:
std::sort(std::begin(Brray), std::end(Brray));
第四,有比原始数组更好的选择。例如,使用std::vector
。好处之一是您可以访问.size()
。
第五,不要使用system("pause");
。改用std::cin.get();
。
第六名,rand()
并不是获得均匀分布随机数的准确方法。这是一个更好的选择:
#include <random>
// both min and max inclusive
int rnd(int min, int max) {
std::random_device rand_dev; // create a random device
std::mt19937 mt(rand_dev()); // create a mersenne_twister
std::uniform_int_distribution<int> dist(min, max); // uniformly distribute between min and max
return dist(mt);
}
第七,using namespace std;
不好。我会让您进行研究以找出原因。
还有一些改进,但我认为已经有很多工作要做。
- OpenMP阵列性能较差
- 如何将三维尺寸不固定的三维阵列展平为一维阵列
- 当我的阵列太大时出现分段错误
- 位阵列上的快速AND运算
- 阵列必须使用大括号封闭的初始器进行初始化
- 没有从阵列<float>到阵列<int>的可行转换
- C++动态安全 2D 交错阵列
- 我已经阅读了很多关于 2d 数组的信息,但我在作业中使用它时遇到了麻烦
- 将平面阵列重塑为复杂的特征类型
- 如何使用英特尔 PIN 捕获阵列的所有负载?
- 为什么我能够为阵列分配比计算机实际拥有的内存更多的内存
- 库特<<恩德尔;不适用于打印 2D 阵列
- 数组类 阵列的打印输出
- 查找奇数平方和时遇到麻烦
- 从较小的阵列到较大的阵列的元素级转换
- 仅在大型阵列上出现合并排序分段错误
- 串和阵列的麻烦
- 浮子阵列的视觉C 向量会产生麻烦
- 麻烦在G 中初始化阵列
- 排序阵列的麻烦