2014-01-25 67 views
1
#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

如果您希望人们阅读您的代码,请注意妥善布置它。您的缩进被打破,线条之间的空白太多。 – GreenAsJade

+0

看看最后一部分,将Brray转换为有序的Array。也许你应该分配到阵列而不是布雷在双? – Noctua

+0

为什么这是一个二维数组而不是一维数组? –

回答

3

Brray[w]=Array[i][j];

周围走错了路。

你从来没有真正写入数组。

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); 

此外,你切换赋值操作的顺序,移动内容时回二维数组:

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数组的两种功能(反之亦然),以及另一种用于实际排序的功能。两者都可以接受可变大小的数组,使其适用于同一程序中的更多问题。这也适用于用随机数填充数组的函数。

在C++的情况下,另一个有用的建议是声明关于你需要它们的地方的变量,而不是在函数的开头堆叠它们。请参阅上面代码中的w变量。

+0

@GreenAsJade的确,我很抱歉。你至少应该得票。 –

+0

Thx mate。通过一切手段编辑你的答案是完整的,这很好 - 你增加了额外的价值。信贷的应有的地方就是所有......它使这个地方变得圆滑:) – GreenAsJade

-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; 
     } 

其次,正如其他人所提到的,你实际上并没有更新你的二维数组。

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;是坏的。我会让你做研究,找出原因。

还有一些改进,但我认为你已经有很多工作。

+0

Windows系统上的system(“pause”)有什么问题?它给出了一个消息,'cin.get()'不。此外,'cin.get()'如果'cin'设置了错误,可能会不正常工作。在这种情况下'使用命名空间标准'也没有错。是的,我做了我的研究。 –

+0

@PawełStawarzhttp://stackoverflow.com/questions/1107705/systempause-why-is-it-wrong – Oleksiy

+0

@PawełStawarz,它很慢,它不是可移植的,这是不好的风格:只有在真正需要时才会进行系统调用。 'cin.get()'在各方面都更好。 – Oleksiy