Tìm Mode của tập dữ liệu bằng cách chèn vào danh sách liên kết đơn đã sắp xếp, mỗi nút lưu giá trị và số lần xuất hiện (count).
Thuật toán
Hàm insertInSet(head, val):
Tạo nút mới.
Nếu head rỗng: head = nút mới, count=1.
Nếu val < head->data: chèn đầu, count=1.
Nếu val == head->data: tăng count.
Ngược lại: duyệt tìm vị trí chèn sao cho danh sách tăng dần.
Nếu gặp giá trị trùng: tăng count.
Chèn nút mới với count=1.
Trả về head.
Main:
Đọc n phần tử, gọi insertInSet.
Duyệt danh sách tìm max count và giá trị tương ứng.
Ví dụ mã nguồn
#include <iostream>
using namespace std;
struct Node {
int data, cnt;
Node* next;
};
Node* insertInSet(Node* head, int val) {
Node* nn = new Node{val, 0, nullptr};
if (!head) { head = nn; head->cnt++; return head; }
if (val < head->data) {
nn->next = head; nn->cnt++; return nn;
}
if (val == head->data) { head->cnt++; return head; }
Node* t = head;
while (t->next) {
if (val == t->next->data) { t->next->cnt++; return head; }
if (val < t->next->data) break;
t = t->next;
}
nn->next = t->next; t->next = nn; nn->cnt++;
return head;
}
int main() {
int n, val;
cout << "So phan tu: "; cin >> n;
Node* head = nullptr;
for (int i = 0; i < n; i++) {
cout << "Phan tu " << i+1 << ": "; cin >> val;
head = insertInSet(head, val);
}
int mode = 0, maxCnt = 0;
cout << "Du lieu da sap xep: ";
while (head) {
cout << head->data << "(" << head->cnt << ") ";
if (head->cnt > maxCnt) { maxCnt = head->cnt; mode = head->data; }
head = head->next;
}
cout << "\nMode = " << mode << ", xuat hien " << maxCnt << " lan.\n";
return 0;
}
Đầu ra mẫu
So phan tu: 10 Phan tu: 1 2 0 2 3 7 6 2 1 1 Du lieu da sap xep: 0(1) 1(3) 2(3) 3(1) 6(1) 7(1) Mode = 1, xuat hien 3 lan.