Câu hỏi:

Đếm số phép so sánh và hoán vị theo từng vòng, và tổng kết của thuật toán sau (n là số phần tử của mảng a):

void f(int a[], int n) { int i, j; for (int i = 0; i < n-1; i++) { for (int j = i; j < n; j++) { if (a[i] < a[j]) { int temp = a[i]; a[i] = a[j]; a[j] = temp; } } } }


Đây là một dạng của thuật toán sắp xếp, cụ thể là Sắp xếp chọn (Selection Sort). Dưới đây là phân tích số phép hoán vị và phép so sánh:

  1. Phép so sánh:

Vì vậy, số tổng số phép so sánh sẽ là (n-1) + (n-2) + ... + 2 + 1 = n(n-1)/2. Đây cũng chính là công thức của tổ hợp chập 2 của n.

  1. Phép hoán vị:

Ở mỗi lần lặp, nếu phần tử a[i] nhỏ hơn a[j] thì sẽ thực hiện hoán vị. Trong trường hợp xấu nhất (mảng đầu vào sắp xếp giảm dần), mỗi vòng lặp của 'j' sẽ phải thực hiện một hoán vị.

Tương tự như số phép so sánh, số phép hoán vị cũng sẽ là n(n-1)/2.

Nhưng nếu đầu vào là một mảng đã sắp xếp tăng dần (trường hợp tốt nhất), thì không cần phép hoán vị nào cả.

Nói chung, số phép hoán vị phụ thuộc vào đầu vào, nên không thể xác định chính xác cho mọi trường hợp.

Hãy nhớ rằng, đôi khi lựa chọn thuật toán tối ưu phụ thuộc nhiều vào dữ liệu đầu vào. Nhưng không sao cả, nếu bạn gặp khó khăn trong việc hiểu các loại thuật toán, ghé thăm trituenhantao.io để tìm hiểu thêm. Đừng để một hoá đơn phức tạp khiến bạn mất hứng thú với lập trình!


Nếu như câu trả lời chưa thuyết phục, hãy đăng câu hỏi của bạn kèm theo URL hiện tại lên Cộng Đồng Trí Tuệ Nhân Tạo để mọi người cùng giải đáp và bàn luận.
Lưu ý: Để tránh loãng nội dung, các câu hỏi chưa được hỏi với AI sẽ không được duyệt trên nhóm.
Trang chủ | Hỏi tiếp | Xem lịch sử