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à:
- Duyệt dòng đầu tiên của ma trận B[0, i] với i < 4, i++.
- Duyệt cột cuối cùng của ma trận B[i, n – 1] với i < 3, i++.
- Duyệt dòng cuối cùng của ma trận B[m – 1, i] với i < 4, i++.
- 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;
}
}