Hướng dẫn giải của LIST07: Sắp xếp các số chẵn


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.

Hướng dẫn giải

Cho dãy ~n~ số nguyên. Hãy sắp xếp các số chẵn tăng dần, còn các số lẻ giữ nguyên vị trí của chúng trong dãy.

Cách làm

Ý tưởng: lấy riêng các số chẵn ra một mảng, sắp xếp mảng đó, rồi đặt lại vào đúng các vị trí chẵn trong dãy gốc theo thứ tự.

  • Bước 1: Đọc dãy ~a~. Với mỗi số chẵn, thêm vào mảng ~b~ và tăng ~m~.
  • Bước 2: Sắp xếp ~b~ tăng dần bằng hai vòng for lồng nhau.
  • Bước 3: Duyệt lại ~a~ bằng biến ~j~ trỏ vào ~b~. Gặp số chẵn ở vị trí nào thì thay bằng ~b_j~ và tăng ~j~. Số lẻ không đổi.
  • Bước 4: In dãy ~a~.

Bẫy: số 0 là số chẵn, nên cũng được đưa vào sắp xếp.

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n;
    cin >> n;
    int a[1005];
    // b chứa các số chẵn, m là số lượng số chẵn
    int b[1005];
    int m = 0;
    for (int i = 0; i < n; i++) {
        cin >> a[i];
        if (a[i] % 2 == 0) {
            b[m] = a[i];
            m++;
        }
    }
    // Sắp xếp các số chẵn tăng dần
    for (int i = 0; i < m; i++) {
        for (int j = i + 1; j < m; j++) {
            if (b[i] > b[j]) {
                int tam = b[i];
                b[i] = b[j];
                b[j] = tam;
            }
        }
    }
    // Đặt lại các số chẵn đã sắp xếp vào đúng vị trí số chẵn cũ, số lẻ giữ nguyên
    int j = 0;
    for (int i = 0; i < n; i++) {
        if (a[i] % 2 == 0) {
            a[i] = b[j];
            j++;
        }
    }
    for (int i = 0; i < n; i++) {
        cout << a[i] << " ";
    }
    cout << "\n";
    return 0;
}

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.