#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++;
}
好的,这就是我的代码。我需要做的就是排序部分,我写了泡泡分类技术,我仔细检查了我的课程,这是相同的逻辑。所以我想知道的是,为什么我的数组在屏幕上打印时没有排序。
感谢您的帮助
答案 0 :(得分:3)
此
Brray[w]=Array[i][j];
是错误的方式。
你永远不会真正写入数组。
答案 1 :(得分:2)
您遇到的一个问题是,在实施冒泡排序算法时,您假设的总大小为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++;
}
我还建议您将程序的逻辑拆分为更通用和可管理的部分:将两个数组重新解释为一维数组的两个函数(反之亦然),另一个用于实际排序。两者都可以接受可变大小的数组,使其适用于同一程序中的更多问题。这也适用于使用随机数填充数组的函数。
对于C ++,另一个有用的建议是声明变量关于你需要它们的位置,而不是在函数的开头叠加它们。请参阅上面代码中的w
变量。
答案 2 :(得分:-1)
这段代码有很多问题......
首先,你的排序是错误的。这将有效
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;
很糟糕。我会让你做研究找出原因。
还有一些改进,但我认为你已经有很多工作要做了。