c++ - 在三维数组中排列数字

标签 c++ arrays sorting

我正在尝试制作一个 shell 算法来排列 [5][5][5] 数组,到目前为止我可以打印整个数组但是当我运行 shell() 时它打印相同的数组。它不打印排列的数字。有什么帮助吗?

#include <iostream>  
#include <stdlib.h>
using namespace std;
    void ordShell(int numbers[5][5][5], int n);
    void exchange(int& x, int& y);

    int main()
    {
    int numbers[5][5][5] = {
    { {1,2,3,4,5}, {41,42,43,44,45},  {11,12,13,14,15}, {16, 17, 18, 19, 20}, {21, 22, 23, 24, 25} },

    { {26,27,28,29,30}, {31,32,33,34,35 }, {36,37,38,39,40}, {6,7,8,9,10}, {46, 47, 48, 49, 50},  },

    { {51, 52, 53, 54, 55}, {56,57,58,59,60}, {61,62,63,64,65}, {66, 67, 68, 69, 70}, {71, 72, 73, 74, 75}, },

    { {76, 77, 78, 79, 80}, {81,82,83,84,85}, {86,87,88,89,90}, {91, 92, 93, 94, 95}, {96, 97, 98, 99, 100}, },

    { {101, 102, 103, 104, 105}, {106,107,108,109,110}, {111, 112, 113, 114, 115}, {116, 117, 118, 119, 120}, {121, 122, 123, 124, 125} }
    };


        for(int i=0;i<5;i++)
        {
           for(int j=0;j<5;j++)
           {
                 for(int l=0;l<5;l++)
           {
            cout<<numbers[i][j][l]<<",";

        }
    }}

    cout<<"whatever"<<"";

        cout<<"\n"<<"";
        cout<<"NOW COMES SHELL"<<"";
        ordShell(numbers,5);

    cout<<"NUMBERS ARRANGED AFTER SHELL"<<"";
        for(int i=0;i<5;i++)
        {
           for(int j=0;j<5;j++)
           {
                 for(int l=0;l<5;l++)
           {
            cout<<numbers[i][j][l]<<",";



        }
    }}

        return 0;
    }

    void ordShell(int numbers[5][5][5], int n)

    {
        int jump, i, j, k,j1,j2,k1,k2;
        jump = n / 2;
        while (jump > 0)
        {
        for (i = jump; i < n; i++)
        {
            j = i - jump;
            j1= i - jump;
            j2= i - jump;
            while (j >= 0 )
            {
                k = j + jump;
                    k1 = j + jump;
                        k2 = j + jump;
                if (numbers[j][j1][j2] <= numbers[k][k1][k2])
                {j = -1; // arranged pair
                    j1 = -1;
                    j2 = -1;}
                else
                {
                    cout<<"exchange: "<<"";
                    cout<<numbers[j][j1][j2]<<" ";
                    cout<<numbers[k][k1][k2]<<"\n";
                    exchange(numbers[j][j1][j2], numbers[k][k1][k2]);

                    j -= jump;
                    j1 -= jump;
                    j2 -= jump;


                }
            }
        }
        jump = jump / 2;
        cout<<"Jump: "<<jump<<"\n";
        }
    }



    void exchange(int& x, int& y)
    {
        int aux = x;
        x = y;
        y = aux;
    }

最佳答案

您的函数中的问题非常简单:您没有修改数组,而只是修改它的一个拷贝:

void ordShell(int numbers[5][5][5], int n)//makes a copy of numbers

如果你想避免这个问题,你需要给你的函数一个指针。

但是,C++ 方法是使用 STL,因此您应该以这种方式创建数组:std::vector<std::vector<std::vector<int> > > (之后可以使用相同的初始化)

这样在您的函数中您只需要传递对此的引用:

void ordShell(std::vector<std::vector<std::vector<int> > >& numbers, int n)

您还可以使用 typedef使变量名更易于阅读:

typedef std::vector<std::vector<std::vector<int> > > vector3D

最后一件事,您不需要 exchange功能,std::swap做同样的事情。

关于c++ - 在三维数组中排列数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30610443/

相关文章:

c++ - C++ 中的标点符号是什么?

c++ - OpenCV 在使用 imgproc 函数时报错(二)

c - 将用户输入的大数字存储到整数数组中

c++ - 无条件排序数组

sorting - Redis:在 alpha 中排序哈希 "fields"

c++ - 运算符 = 使用模板重载

c++ - (a=1)=2 在 C++98 中是未定义的行为吗?

javascript - 循环遍历 String 中的对象数组

python - 使用自定义谓词对 numpy 数组进行排序

java - 在 Java 中不区分大小写的字母数字数据(和特殊字符)的排序标准