Một cách khác không cần tạo ra mảng mới tmp
mà là hoán vị trực tiếp từng cặp phần tử trên mảng thông qua vị trí trung tâm của nó, ví dụ ta có mảng A là {1, 2, 3, 4, 5}.
Vị trí trung tâm là số 3, ta cho một vòng lặp i
chạy từ số 1 tới số 3 và một vòng lặp j
chạy từ số 5 tới số 3, mỗi lần chạy, ta hoán đổi vị trí của chúng với nhau, vì 3 là số trung tâm nên 3 không cần hoán đổi, kết quả ta được một mảng số nguyên đã được đảo ngược.
Đoạn mã nguồn minh họa cho ý tưởng của mình.
#include <iostream>
using namespace std;
void hoanVi2So(int &a, int &b) {
int tmp = a;
a = b;
b = tmp;
}
void daoNguocMang(int *&A, int n) {
int middle = n / 2;
int j = n - 1;
for (int i = 0; i < middle; i++) {
hoanVi2So(A[i], A[j]);
j--;
}
}
int main()
{
int *A;
int n;
cout << "Nhap vao so luong phan tu n = ";
cin >> n;
// Cấp phát bộ nhớ
A = new int[n];
// Nhập mảng
for (int i = 0; i < n; i++) {
cout << "Nhap vao phan tu A[" << i << "] = ";
cin >> A[i];
}
// Gọi hàm đảo ngược mảng
daoNguocMang(A, n);
// Xuất mảng kết quả ra màn hình.
for (int i = 0; i < n; i++) {
cout << A[i] << " ";
}
delete[]A;
}
Mình nghĩ cách đơn giản nhất là tạo ra một mảng mới gọi là tmp
, sau đó duyệt mảng A
bắt đầu từ vị trí cuối mảng, tức là tại vị trí n - 1
về lại đầu mảng, tức là vị trí 0
, với mỗi phần tử đi qua ở mảng A
, sao chép nó qua mảng tmp
, đồng thời tăng chỉ số của mảng tmp
để chuẩn bị cho việc lưu một phần tử tiếp theo.
#include <stdio.h>
int* daoNguocMang(int *A, int n) {
int *tmp = new int[n]; // Tạo 1 mảng tạm
int j = 0;
// Duyệt ngược mảng A, bắt đầu từ phần tử cuối
// Mỗi lần duyệt, lưu từng phần tử duyệt được vào mảng tạm
for (int i = n - 1; i >= 0; i--) {
tmp[j] = A[i];
j++;
}
return tmp;
}
void printArr(int *A, int n) {
for (int i = 0; i < n; i++) {
printf("%5d", A[i]);
}
}
int main()
{
int A[] = { 1, 2, 3, 4, 5, 6 }; // Ví dụ một mảng số nguyên cố định có 6 phần tử
int n = sizeof(A) / sizeof(int); // Một cách đơn giản để tính n = 6
// Gọi hàm đảo ngược mảng
int *kq = daoNguocMang(A, n);
// Xuất mảng kết quả ra màn hình.
printArr(kq, n);
}
Đảo ngược mảng trong C++ là xử lý viết lại một mảng với các phần tử theo thứ tự ngược lại từ cuối lên đầu. Lưu ý ở đây mảng là mảng số, do đó chúng ta cũng có thể gọi xử lý này là đảo ngược dãy số trong C++. Chương trình mẫu đảo ngược mảng 1 chiều các số nguyên trong C++ tại: Đảo ngược mảng trong C++