簡體   English   中英

按升序對次對角線的元素進行排序 C++

[英]Sort elements of secondary diagonal in ascending order C++

正如我所想,我需要將 function printSecondaryDiagonal (實際上打印輔助對角線的元素)轉換為一維數組,然后按升序對其元素進行排序,對嗎?

PS 一開始的二維數組一定是動態的。 此外,不能使用vector來做到這一點。 只有malloc , callocnew

#include <iostream>
#include <iomanip>
using namespace std;

void getManual(int** arr, int rows, int columns);
void getRandom(int** arr, int rows, int columns);
void printSecondaryDiagonal(int** arr, int rows, int columns);

void main() {
    int rowCount = 5;
    int colCount = 6;

    cout << "Enter quantity of rows: ";
    cin >> rowCount;
    cout << "Enter quantity of columns: ";
    cin >> colCount;

    int** arr = new int* [rowCount];

    for (int i = 0; i < rowCount; i++) {
        arr[i] = new int[colCount];
    }

    cout << " Array formation algorithm\n";
        start:
    cout << "Input number : \n1 for manual\n2 for random\n";
    int k;
    cin >> k;
    switch (k) {
    case 1: getManual(arr, rowCount, colCount);
        break;
    case 2: getRandom(arr, rowCount, colCount);
        break;
    default:cout << "Input 1 or 2, please.";
        cout << endl << endl;
        goto start;
    }
    cout << endl;

    printSecondaryDiagonal(arr, rowCount, colCount);
        
    for (int i = 0; i < rowCount; i++) { //очищуємо память для кожного рядка
        delete[] arr[i];
    }

    delete[] arr;
}

void getManual(int** arr, int rows, int columns) { //введення з клавіатури
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < columns; j++) {
            cout << "a[" << i << "][" << j << "]=";
            cin >> arr[i][j];
            //cin >> *(*(arr + i) + j); //вказівникова форма
        }
    }
}

void getRandom(int** arr, int rows, int columns) { //випадкова генерація чисел
    int lowest = -21, highest = 34;
    int i, j;
    srand(time(NULL));
    // ініціалізація масива
    for (i = 0; i < rows; i++) {
        for (j = 0; j < columns; j++) {
            arr[i][j] = lowest + rand() % (highest - lowest + 1);
            cout << setw(7) << arr[i][j];
        }
        cout << endl;
    }
}

Function 我需要轉換為一維數組,這對我來說是主要問題:

void printSecondaryDiagonal(int** arr, int rows, int columns) {
    
    cout << "Secondary Diagonal: ";
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < columns; j++) {

            // Condition for secondary diagonal
            if ((i + j) == (columns - 1)) {
                cout << arr[i][j] << setw(7);
            }
        }
    }
    
}

正如我將展示的那樣,可以使用一個 for 循環提取次對角線的元素。 次對角線將保存在一維數組 `secDiag[i]` 中。 然后,使用 `algorithm` 頭文件中的 `std::sort` 對這個數組進行升序排序。

void printSecondaryDiagonal(int** arr, int rows, int columns) {

    cout << "Secondary Diagonal: ";
    int *secDiag = new int [rows];
    int r, c;
    for (r = 0; r < rows ; r++) {
              c = columns - r -1;
             if (c < 0) break;
             secDiag[r] = arr[r][c];
        }
    for (int i =0; i<r; i++) std::cout << setw(7) << secDiag[i];
    std::cout << std::endl;
    std::cout << "After sorted: ";
    std::sort(secDiag, secDiag+r);
    for (int i =0; i<r; i++) std::cout << setw(7) << secDiag[i];
    std::cout << std::endl;
    delete [] secDiag;
}

試運行:

Enter quantity of rows: 3
Enter quantity of columns: 3
 Array formation algorithm
Input number :
1 for manual
2 for random
2
     33    -13     29
     -7     -2     10
     -8     18      6

Secondary Diagonal:      29     -2     -8
After sorted:      -8     -2     29
  void printSecondaryDiagonal(int** arr, int rows, int columns) {
        
    cout << "Secondary Diagonal: ";
    int i = 0;
    int j = columns - 1;
    int k = 0;
    int size =0;
    if (rows>columns)
    {
      size = columns;
    }
    else 
    {
      size = rows;
    }
    int *diagonal = new int[size];
    while (i < rows && j >= 0)
    {
      diagonal[k] = arr[i][j];

      cout << arr[i][j] << setw (7);
      i++;
      j--;
      k++;
    }
    for (int i = 0; i < size - 1; i++)
    {
      for (int j = 0; j < size - i - 1; j++)
        {
          if (diagonal[j] > diagonal[j + 1])
           {
            // swap arr[j+1] and arr[j] 
            int temp = diagonal[j];
            diagonal[j] = diagonal[j + 1];
            diagonal[j + 1] = temp;
           }
         }
      }
    for (int r = 0; r < size; r++)
    {
      cout << diagonal[r] << endl;
    }
    delete [] diagonal;        
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM