是的,我写了一个程序,根据每行中所有正偶数元素的和,按升序对二维数组的行进行排序,但是它不能正常工作。有时它可以正确地交换行,但大多数情况下,它感觉这个程序只交换两个相邻的行或类似的东西。
很可能,对二维数组不正确地使用冒泡排序存在问题。下面是我做了大部分事情的函数:
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。我知道你们大多数人会觉得这很容易,但对我来说绝对不是,因为这项任务是我在大学里的家庭作业,而且我们还没有学过任何排序算法。不管怎么说,当我问老师我怎样才能对行进行那样的排序时,他告诉我用冒泡排序,于是我就来了
这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;
}
}
进一步