Tìm Min và Max trong mảng

Duyệt qua từng phần tử và so sánh để tìm giá trị nhỏ nhất và lớn nhất — nền tảng của mọi bài toán thao tác trên mảng.

Bài toán

Cho mảng số nguyên a[]n phần tử. Hãy tìm giá trị nhỏ nhất (min)giá trị lớn nhất (max) trong mảng đó.

💡
Ý tưởng: Khởi tạo minmax bằng phần tử đầu tiên (a[0]), sau đó duyệt từ chỉ số 1 đến n-1 và cập nhật nếu tìm thấy giá trị nhỏ hơn hoặc lớn hơn hiện tại.

Từng bước thực hiện

  1. Gán min = max = a[0]
  2. Lặp i từ 1 đến n - 1
  3. Nếu a[i] < min → cập nhật min = a[i]
  4. Nếu a[i] > max → cập nhật max = a[i]
  5. Sau vòng lặp, minmax là kết quả

Cài đặt bằng C

min_max.c
#include <stdio.h>

// Hàm tìm min và max trong mảng
void findMinMax(int a[], int n, int *min, int *max) {
    // Khởi tạo min, max bằng phần tử đầu tiên
    *min = a[0];
    *max = a[0];

    for (int i = 1; i < n; i++) {
        if (a[i] < *min)  // Tìm thấy giá trị nhỏ hơn
            *min = a[i];
        if (a[i] > *max)  // Tìm thấy giá trị lớn hơn
            *max = a[i];
    }
}

int main() {
    int a[] = {3, 7, 1, 9, 4, 6, 2};
    int n   = sizeof(a) / sizeof(a[0]);
    int min, max;

    findMinMax(a, n, &min, &max);

    printf("Mảng:  ");
    for (int i = 0; i < n; i++)
        printf("%d ", a[i]);

    printf("\nMin = %d\n", min);
    printf("Max = %d\n", max);

    return 0;
}
Output:
Mảng: 3 7 1 9 4 6 2
Min = 1
Max = 9

Demo tương tác

🎮 Tự thử nghiệm

Nhập mảng:
Nhập mảng và nhấn Chạy để xem kết quả...

Phân tích độ phức tạp

Trường hợpThời gianKhông gianGhi chú
Tốt nhấtO(n)O(1)Luôn phải duyệt hết mảng
Trung bìnhO(n)O(1)Không phụ thuộc dữ liệu
Tệ nhấtO(n)O(1)Tất cả trường hợp như nhau
⚠️
Lưu ý: Hàm trên không kiểm tra mảng rỗng (n == 0). Trong thực tế, cần thêm điều kiện kiểm tra trước khi truy cập a[0].

Biến thể: Tìm vị trí (chỉ số)

Đôi khi cần biết phần tử min/max nằm ở chỉ số nào, không chỉ giá trị:

min_max_index.c
int indexOfMin(int a[], int n) {
    int minIdx = 0;
    for (int i = 1; i < n; i++)
        if (a[i] < a[minIdx]) minIdx = i;
    return minIdx;
}

int indexOfMax(int a[], int n) {
    int maxIdx = 0;
    for (int i = 1; i < n; i++)
        if (a[i] > a[maxIdx]) maxIdx = i;
    return maxIdx;
}