提问者:小点点

在二维数组中交换行C++


是的,我写了一个程序,根据每行中所有正偶数元素的和,按升序对二维数组的行进行排序,但是它不能正常工作。有时它可以正确地交换行,但大多数情况下,它感觉这个程序只交换两个相邻的行或类似的东西。

很可能,对二维数组不正确地使用冒泡排序存在问题。下面是我做了大部分事情的函数:

void print(int** arr, int rows, int columns) {
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < columns; j++) {
            cout << setw(7) << arr[i][j];
        }
        cout << endl;
    }
    int* sumRows = new int[rows];
    int sum = 0;
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < columns; j++) {
            if (arr[i][j] > 0 && arr[i][j] % 2 == 0)
            {
                //cout << setw(7) << arr[i][j];
                sum = sum + arr[i][j];
            }
        }
        cout << endl << "Sum of positive even elements in the row " << i + 1 << " = " << sum;
        sumRows[i] = sum;
        sum = 0;
    }
    cout << endl << "Array of sums: ";
    for (int i = 0; i < rows; i++) {
        cout << setw(7) << sumRows[i];
    }

    //for (int i = 0; i < r; i++) cout << setw(7) << sumRows[i];
    cout << endl;

    bool swapped;
    for (int i = 0; i < rows - 1; i++)
    {
        swapped = false;
        for (int j = 0; j < columns - 1; j++)
        {
            for (int k = 0; k < rows - i - 1; k++) {
                if (sumRows[k] > sumRows[k + 1])
                {
                    swap(arr[k][j], arr[k + 1][j]);
                    swapped = true;
                }
            }
        }

        if (swapped == false) break;
    }

    cout << endl << endl << "Swapped array:" << endl;
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < columns; j++) {
            cout << setw(7) << arr[i][j];
        }
        cout << endl;
    }
}

完整代码:

#include <iostream>
#include <iomanip>
#include <time.h>
#include <conio.h>
#include <algorithm>
using namespace std;

int** createMalloc(int, int);
int** createCalloc(int rows, int columns);

int** createNew(int rows, int columns);
void deleteNew(int** arr, int rows);

void init(int**, int, int);
void freeMemory(int**, int);
void print(int**, const int, const int);

void initPrint(int** arr, int rows, int columns);

void main() {
    int rowCount, colCount;
    cout << "Enter number of rows: "; cin >> rowCount;
    cout << "Enter number of columns: "; cin >> colCount;
    cout << " Array creation algorithm\n";
start:
    cout << "Input number : \n1 for malloc\n2 for calloc\n3 for new\n";
    int k;
    cin >> k;
    switch (k) {
    case 1: {
        int** a = createMalloc(rowCount, colCount);
        initPrint(a, rowCount, colCount);

        freeMemory(a, rowCount);
        break;
    }
    case 2: {
        int** a = createCalloc(rowCount, colCount);
        initPrint(a, rowCount, colCount);

        freeMemory(a, rowCount);
        break;
    }
    case 3: {
        int** a = createNew(rowCount, colCount);
        initPrint(a, rowCount, colCount);

        deleteNew(a, rowCount);
        break;
    }
    default:cout << "Input 1, 2 or 3, please.";
        cout << endl << endl;
        goto start;
    }
    cout << endl << endl;
}

int** createMalloc(int rows, int columns) {
    int** arr = (int**)malloc(rows * sizeof(int*));
    for (int i = 0; i < rows; i++) {
        arr[i] = (int*)malloc(columns * sizeof(int));
    }
    return arr;
}

int** createCalloc(int rows, int columns) {
    int** arr = (int**)calloc(rows, sizeof(int*));
    for (int i = 0; i < rows; i++) {
        arr[i] = (int*)calloc(columns, sizeof(int));
    }
    return arr;
}

int** createNew(int rows, int columns) {
    int** arr = new int* [rows];
    for (int i = 0; i < rows; i++) {
        arr[i] = new int[columns];
    }
    return arr;
}

void initPrint(int** arr, int rows, int columns) {
    init(arr, rows, columns);
    print(arr, rows, columns);
}

void init(int** arr, int rows, int columns) {
    const int Low = -10, High = 10;
    srand((unsigned)time(NULL));
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < columns; j++) {
            arr[i][j] = Low + rand() % (High - Low + 1);
        }
    }
}

void freeMemory(int** arr, int rows) {
    for (int i = 0; i < rows; i++) {
        free(arr[i]);
    }
    free(arr);
}

void deleteNew(int** arr, int rows) {
    for (int i = 0; i < rows; i++) {
        delete[] arr[i];
    }
    delete[] arr;
}

void print(int** arr, int rows, int columns) {
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < columns; j++) {
            cout << setw(7) << arr[i][j];
        }
        cout << endl;
    }
    int* sumRows = new int[rows];
    int sum = 0;
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < columns; j++) {
            if (arr[i][j] > 0 && arr[i][j] % 2 == 0)
            {
                //cout << setw(7) << arr[i][j];
                sum = sum + arr[i][j];
            }
        }
        cout << endl << "Sum of positive even elements in the row " << i + 1 << " = " << sum;
        sumRows[i] = sum;
        sum = 0;
    }
    cout << endl << "Array of sums: ";
    for (int i = 0; i < rows; i++) {
        cout << setw(7) << sumRows[i];
    }

    //for (int i = 0; i < r; i++) cout << setw(7) << sumRows[i];
    cout << endl;

    bool swapped;
    for (int i = 0; i < rows - 1; i++)
    {
        swapped = false;
        for (int j = 0; j < columns - 1; j++)
        {
            for (int k = 0; k < rows - i - 1; k++) {
                if (sumRows[k] > sumRows[k + 1])
                {
                    swap(arr[k][j], arr[k + 1][j]);
                    swapped = true;
                }
            }
        }

        //IF no two elements were swapped by inner loop, then break 
        if (swapped == false) break;
    }

    cout << endl << endl << "Swapped array:" << endl;
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < columns; j++) {
            cout << setw(7) << arr[i][j];
        }
        cout << endl;
    }
}

附注。二维数组必须是动态数组。此外,我需要让用户选择使用创建数组。此外,还不能使用执行此任务。

P.P.S。我知道你们大多数人会觉得这很容易,但对我来说绝对不是,因为这项任务是我在大学里的家庭作业,而且我们还没有学过任何排序算法。不管怎么说,当我问老师我怎样才能对行进行那样的排序时,他告诉我用冒泡排序,于是我就来了


共1个答案

匿名用户

这3个循环令我担心,所以我去维基百科查看我的假设。

完全未经测试的代码,使用风险自负

void BSort(int **arr, int *sumRows, int rows, int columns) {
    bool swapped;
    while (true) {
        swapped = false;
        for (int k = 0; k < rows - 1; k++, rows--) { // reduce max row
            if (sumRows[k] > sumRows[k + 1]) {
                swap(arr[k], arr[k + 1]); // swaps the pointers
                swap(sumRows[k], sumRows[k + 1]); // swap the sums too or we swap on false conditions afterward.
                swapped = true;
            }
        }

        if (swapped == false) break;
    }
}

进一步

  • 您应该用一段时间交换goto循环。/li> 未被删除。
  • 使用较小的代码块,使用sumRows,Bubble Sort等函数。/li>

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(二维|数组|中|交|换行|c++)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?