Sắp xếp xoắn ốc mảng hai chiều trong Python và C++

Bài toán sắp xếp xoắn ốc mảng hai chiều tăng dần sẽ cho kết quả như hình sau

Chúng ta cùng tìm cách giải quyết trong Python và C++ ngay nhé

Cách giải quyết Sắp xếp xoắn ốc mảng hai chiều trong Python và C++

Bước 1: Chuyển mảng 2 chiều thành mảng 1 chiều

Bước 2: Sắp xếp mảng 2 theo hướng tăng dần.

Bước 3: Chuyển mảng 1 chiều lại thành mảng 2 chiều theo quy luật hình xoắc ốc.

Ở 2 bước đầu thì đơn giản, ở bước 3, tạo một ma trận mới có số dòng m và số cột n bằng với ma trận ban đầu, sau đó duyệt ma trận mới này theo dạng hình xoắn ốc.

Ví dụ ma trận mới B[3×4] , duyệt theo hình xoắn ốc có nghĩa là:

  1. Duyệt dòng đầu tiên của ma trận B[0, i] với i < 4, i++.
  2. Duyệt cột cuối cùng của ma trận B[i, n – 1] với i < 3, i++.
  3. Duyệt dòng cuối cùng của ma trận B[m – 1, i] với i < 4, i++.
  4. Duyệt dòng còn lại của ma trận B.

Sắp xếp xoắn ốc mảng hai chiều trong Python


































































def hoan_doi_so(a, b):
    tmp = a
    a = b
    b = tmp

# Khởi tạo mảng 2D
m = 3
n = 4

A_2D = 
[
    [1, 24, 5, 45] 
,
    [12, 78, 10, 2] 
,
    [6, 4, 123, 75] 




]

# Chuyển thành mảng 1D
A_1D = [] 








for row in A_2D:
    A_1D.extend(row)

# Sắp xếp mảng 1D tăng dần
A_1D.sort()

# Chuyển mảng 1D thành mảng 2D theo quy luật xoắn ốc
B_2D = [[0 for _ in range(n)] 








 for _ in range(m)]
B_Index = 0
B_Row_Index = 0
B_Col_Index = 0
Row = m
Col = n

while B_Row_Index < Row and B_Col_Index < Col:
    for i in range(B_Col_Index, Col):
        B_2D[B_Row_Index] [i]  = A_1D[B_Index] 





        B_Index += 1
    B_Row_Index += 1

    for i in range(B_Row_Index, Row):
        B_2D[i] [Col - 1]  = A_1D[B_Index] 






        B_Index += 1
    Col -= 1

    if B_Row_Index < Row:
        for i in range(Col - 1, B_Col_Index - 1, -1):
            B_2D[Row - 1] [i]  = A_1D[B_Index] 






            B_Index += 1
        Row -= 1

    if B_Col_Index < Col:
        for i in range(Row - 1, B_Row_Index - 1, -1):
            B_2D[i] [B_Col_Index]  = A_1D[B_Index] 






            B_Index += 1
        B_Col_Index += 1

# In kết quả
for row in B_2D:
    print(' '.join(map(str, row)))

Sắp xếp xoắn ốc mảng hai chiều trong C++




























































































































#include "pch.h"
#include <iostream>
using namespace std;
#pragma warning(disable:4996)

void hoanDoiSo(int &a, int &b) {
    int tmp = a;
    a = b;
    b = tmp;
}

int main()
{

    // Khởi tạo mảng, improve chỗ này bằng cách cho phép nhập
    // m n và mảng A từ màn hình console.
    const int m = 3;
    const int n = 4;

    int A_2D[m] [n] 






 = {
        { 1, 24, 5, 45 },
        { 12, 78, 10, 2 },
        { 6, 4, 123, 75 }
    };

    // Chuyển thành mảng 1D
    int A_1D[m * n] 




;
    int A_1D_Index = 0;

    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            A_1D[A_1D_Index]  = A_2D[i] [j] 







;
            A_1D_Index++;
        }
    }

    // Sắp xếp mảng 1D theo hướng tăng dần
    for (int i = 0; i < m * n; i++) {
        for (int j = i; j < m *n; j++) {
            if (A_1D[i]  > A_1D[j] 
) {
                hoanDoiSo(A_1D[i] , A_1D[j] 





);
            }
        }
    }

    // Chuyển 1D lại thành 2D theo quy luật xoắn ốc
    int B_2D[m] [n] 











 = { 0 };
    int B_Index = 0;
    int B_Row_Index = 0;
    int B_Col_Index = 0;
    int Row = m;
    int Col = n;

    while (B_Row_Index < Row && B_Col_Index < Col) {

        // 1. Duyệt dòng đầu tiên của ma trận B
        for (int i = B_Col_Index; i < Col; i++)
        {
            B_2D[B_Row_Index] [i]  = A_1D[B_Index] 








;
            B_Index++;
        }

        B_Row_Index++;

        // 2. Duyệt cột cuối cùng của ma trận B
        for (int i = B_Row_Index; i < Row; i++)
        {
            B_2D[i] [Col - 1]  = A_1D[B_Index] 










;
            B_Index++;
        }

        Col--;

        // 3. Duyệt dòng cuối cùng của ma trận B
        if (B_Row_Index < Row)
        {
            for (int i = Col - 1; i >= B_Col_Index; i--)
            {
                B_2D[Row - 1] [i]  = A_1D[B_Index] 










;
                B_Index++;
            }
            Row--;
        }

        // 4. Duyệt dòng còn lại của ma trận B
        if (B_Col_Index < Col)
        {
            for (int i = Row - 1; i >= B_Row_Index; i--)
            {
                B_2D[i] [B_Col_Index]  = A_1D[B_Index] 










;
                B_Index++;
            }
            B_Col_Index++;
        }

    }

    // Print kết quả
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            cout << B_2D[i] [j] 




 << " ";
        }
        cout << endl;
    }

}

 

Read:   Trong python có lệnh sắp xếp sẵn rồi vậy còn học thuật toán sắp xếp để làm gì?
Hình đại diện của người dùng

admin

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *