fork download
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4.  
  5. // Cấu trúc lưu trữ thông tin học sinh
  6. struct HocSinh {
  7. string hoTen;
  8. string gioiTinh;
  9. int namSinh;
  10. float diemTongKet;
  11. };
  12.  
  13. // Hàm hiển thị danh sách học sinh
  14. void hienThiDanhSach(HocSinh ds[], int n) {
  15. for (int i = 0; i < n; i++) {
  16. cout << ds[i].hoTen << "\t" << ds[i].gioiTinh << "\t" << ds[i].namSinh << "\t" << ds[i].diemTongKet << endl;
  17. }
  18. cout << "---------------------------------\n";
  19. }
  20.  
  21. // 1. Sắp xếp phân đoạn (Shell Sort) theo tên
  22. void shellSort(HocSinh ds[], int n) {
  23. for (int gap = n / 2; gap > 0; gap /= 2) {
  24. for (int i = gap; i < n; i++) {
  25. HocSinh temp = ds[i];
  26. int j;
  27. for (j = i; j >= gap && ds[j - gap].hoTen > temp.hoTen; j -= gap) {
  28. ds[j] = ds[j - gap];
  29. }
  30. ds[j] = temp;
  31. }
  32. }
  33. }
  34.  
  35. // 2. Sắp xếp vun đống (Heap Sort) theo năm sinh giảm dần
  36. void heapify(HocSinh ds[], int n, int i) {
  37. int largest = i;
  38. int left = 2 * i + 1;
  39. int right = 2 * i + 2;
  40.  
  41. if (left < n && ds[left].namSinh > ds[largest].namSinh)
  42. largest = left;
  43.  
  44. if (right < n && ds[right].namSinh > ds[largest].namSinh)
  45. largest = right;
  46.  
  47. if (largest != i) {
  48. swap(ds[i], ds[largest]);
  49. heapify(ds, n, largest);
  50. }
  51. }
  52.  
  53. void heapSort(HocSinh ds[], int n) {
  54. for (int i = n / 2 - 1; i >= 0; i--)
  55. heapify(ds, n, i);
  56.  
  57. for (int i = n - 1; i > 0; i--) {
  58. swap(ds[0], ds[i]);
  59. heapify(ds, i, 0);
  60. }
  61. }
  62.  
  63. // 3. Sắp xếp trộn (Merge Sort) theo điểm tổng kết tăng dần
  64. void merge(HocSinh ds[], int left, int mid, int right) {
  65. int n1 = mid - left + 1;
  66. int n2 = right - mid;
  67.  
  68. HocSinh L[n1], R[n2];
  69. for (int i = 0; i < n1; i++)
  70. L[i] = ds[left + i];
  71. for (int j = 0; j < n2; j++)
  72. R[j] = ds[mid + 1 + j];
  73.  
  74. int i = 0, j = 0, k = left;
  75. while (i < n1 && j < n2) {
  76. if (L[i].diemTongKet <= R[j].diemTongKet) {
  77. ds[k] = L[i];
  78. i++;
  79. } else {
  80. ds[k] = R[j];
  81. j++;
  82. }
  83. k++;
  84. }
  85.  
  86. while (i < n1) {
  87. ds[k] = L[i];
  88. i++; k++;
  89. }
  90. while (j < n2) {
  91. ds[k] = R[j];
  92. j++; k++;
  93. }
  94. }
  95.  
  96. void mergeSort(HocSinh ds[], int left, int right) {
  97. if (left < right) {
  98. int mid = left + (right - left) / 2;
  99. mergeSort(ds, left, mid);
  100. mergeSort(ds, mid + 1, right);
  101. merge(ds, left, mid, right);
  102. }
  103. }
  104.  
  105. int main() {
  106. HocSinh danhSach[] = {
  107. {"Nguyen Van A", "Nam", 2005, 8.5},
  108. {"Tran Thi B", "Nu", 2004, 7.2},
  109. {"Le Van C", "Nam", 2006, 9.0},
  110. {"Pham Thi D", "Nu", 2003, 6.8},
  111. {"Hoang Van E", "Nam", 2005, 7.5}
  112. };
  113. int n = sizeof(danhSach) / sizeof(danhSach[0]);
  114.  
  115. cout << "Danh sach ban dau:\n";
  116. hienThiDanhSach(danhSach, n);
  117.  
  118. // Sắp xếp theo tên (từ điển)
  119. shellSort(danhSach, n);
  120. cout << "Danh sach sap xep theo ten:\n";
  121. hienThiDanhSach(danhSach, n);
  122.  
  123. // Sắp xếp theo năm sinh (giảm dần)
  124. heapSort(danhSach, n);
  125. cout << "Danh sach sap xep theo nam sinh (giam dan):\n";
  126. hienThiDanhSach(danhSach, n);
  127.  
  128. // Sắp xếp theo điểm tổng kết (tăng dần)
  129. mergeSort(danhSach, 0, n - 1);
  130. cout << "Danh sach sap xep theo diem tong ket (tang dan):\n";
  131. hienThiDanhSach(danhSach, n);
  132.  
  133. return 0;
  134. }
  135.  
Success #stdin #stdout 0s 5284KB
stdin
Standard input is empty
stdout
Danh sach ban dau:
Nguyen Van A	Nam	2005	8.5
Tran Thi B	Nu	2004	7.2
Le Van C	Nam	2006	9
Pham Thi D	Nu	2003	6.8
Hoang Van E	Nam	2005	7.5
---------------------------------
Danh sach sap xep theo ten:
Hoang Van E	Nam	2005	7.5
Le Van C	Nam	2006	9
Nguyen Van A	Nam	2005	8.5
Pham Thi D	Nu	2003	6.8
Tran Thi B	Nu	2004	7.2
---------------------------------
Danh sach sap xep theo nam sinh (giam dan):
Pham Thi D	Nu	2003	6.8
Tran Thi B	Nu	2004	7.2
Nguyen Van A	Nam	2005	8.5
Hoang Van E	Nam	2005	7.5
Le Van C	Nam	2006	9
---------------------------------
Danh sach sap xep theo diem tong ket (tang dan):
Pham Thi D	Nu	2003	6.8
Tran Thi B	Nu	2004	7.2
Hoang Van E	Nam	2005	7.5
Nguyen Van A	Nam	2005	8.5
Le Van C	Nam	2006	9
---------------------------------