排序数组的麻烦

时间:2014-01-25 23:22:54

标签: c++ arrays sorting

#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++;

}

好的,这就是我的代码。我需要做的就是排序部分,我写了泡泡分类技术,我仔细检查了我的课程,这是相同的逻辑。所以我想知道的是,为什么我的数组在屏幕上打印时没有排序。

感谢您的帮助

3 个答案:

答案 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;很糟糕。我会让你做研究找出原因。

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