排序阵列的麻烦

Trouble with sorting array

本文关键字:麻烦 阵列 排序      更新时间:2023-10-16
#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;不好。我会让您进行研究以找出原因。

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