#include <iostream>
#include <string>
using namespace std;
// Cấu trúc lưu trữ thông tin học sinh
struct HocSinh {
string hoTen;
string gioiTinh;
int namSinh;
float diemTongKet;
} ;
// Hàm hiển thị danh sách học sinh
void hienThiDanhSach( HocSinh ds[ ] , int n) {
for ( int i = 0 ; i < n; i++ ) {
cout << ds[ i] .hoTen << "\t " << ds[ i] .gioiTinh << "\t " << ds[ i] .namSinh << "\t " << ds[ i] .diemTongKet << endl;
}
cout << "---------------------------------\n " ;
}
// 1. Sắp xếp phân đoạn (Shell Sort) theo tên
void shellSort( HocSinh ds[ ] , int n) {
for ( int gap = n / 2 ; gap > 0 ; gap / = 2 ) {
for ( int i = gap; i < n; i++ ) {
HocSinh temp = ds[ i] ;
int j;
for ( j = i; j >= gap && ds[ j - gap] .hoTen > temp.hoTen ; j - = gap) {
ds[ j] = ds[ j - gap] ;
}
ds[ j] = temp;
}
}
}
// 2. Sắp xếp vun đống (Heap Sort) theo năm sinh giảm dần
void heapify( HocSinh ds[ ] , int n, int i) {
int largest = i;
int left = 2 * i + 1 ;
int right = 2 * i + 2 ;
if ( left < n && ds[ left] .namSinh > ds[ largest] .namSinh )
largest = left;
if ( right < n && ds[ right] .namSinh > ds[ largest] .namSinh )
largest = right;
if ( largest ! = i) {
swap( ds[ i] , ds[ largest] ) ;
heapify( ds, n, largest) ;
}
}
void heapSort( HocSinh ds[ ] , int n) {
for ( int i = n / 2 - 1 ; i >= 0 ; i-- )
heapify( ds, n, i) ;
for ( int i = n - 1 ; i > 0 ; i-- ) {
swap( ds[ 0 ] , ds[ i] ) ;
heapify( ds, i, 0 ) ;
}
}
// 3. Sắp xếp trộn (Merge Sort) theo điểm tổng kết tăng dần
void merge( HocSinh ds[ ] , int left, int mid, int right) {
int n1 = mid - left + 1 ;
int n2 = right - mid;
HocSinh L[ n1] , R[ n2] ;
for ( int i = 0 ; i < n1; i++ )
L[ i] = ds[ left + i] ;
for ( int j = 0 ; j < n2; j++ )
R[ j] = ds[ mid + 1 + j] ;
int i = 0 , j = 0 , k = left;
while ( i < n1 && j < n2) {
if ( L[ i] .diemTongKet <= R[ j] .diemTongKet ) {
ds[ k] = L[ i] ;
i++ ;
} else {
ds[ k] = R[ j] ;
j++ ;
}
k++ ;
}
while ( i < n1) {
ds[ k] = L[ i] ;
i++ ; k++ ;
}
while ( j < n2) {
ds[ k] = R[ j] ;
j++ ; k++ ;
}
}
void mergeSort( HocSinh ds[ ] , int left, int right) {
if ( left < right) {
int mid = left + ( right - left) / 2 ;
mergeSort( ds, left, mid) ;
mergeSort( ds, mid + 1 , right) ;
merge( ds, left, mid, right) ;
}
}
int main( ) {
HocSinh danhSach[ ] = {
{ "Nguyen Van A" , "Nam" , 2005 , 8.5 } ,
{ "Tran Thi B" , "Nu" , 2004 , 7.2 } ,
{ "Le Van C" , "Nam" , 2006 , 9.0 } ,
{ "Pham Thi D" , "Nu" , 2003 , 6.8 } ,
{ "Hoang Van E" , "Nam" , 2005 , 7.5 }
} ;
int n = sizeof ( danhSach) / sizeof ( danhSach[ 0 ] ) ;
cout << "Danh sach ban dau:\n " ;
hienThiDanhSach( danhSach, n) ;
// Sắp xếp theo tên (từ điển)
shellSort( danhSach, n) ;
cout << "Danh sach sap xep theo ten:\n " ;
hienThiDanhSach( danhSach, n) ;
// Sắp xếp theo năm sinh (giảm dần)
heapSort( danhSach, n) ;
cout << "Danh sach sap xep theo nam sinh (giam dan):\n " ;
hienThiDanhSach( danhSach, n) ;
// Sắp xếp theo điểm tổng kết (tăng dần)
mergeSort( danhSach, 0 , n - 1 ) ;
cout << "Danh sach sap xep theo diem tong ket (tang dan):\n " ;
hienThiDanhSach( danhSach, n) ;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKLy8gQ+G6pXUgdHLDumMgbMawdSB0cuG7ryB0aMO0bmcgdGluIGjhu41jIHNpbmgKc3RydWN0IEhvY1NpbmggewogICAgc3RyaW5nIGhvVGVuOwogICAgc3RyaW5nIGdpb2lUaW5oOwogICAgaW50IG5hbVNpbmg7CiAgICBmbG9hdCBkaWVtVG9uZ0tldDsKfTsKCi8vIEjDoG0gaGnhu4NuIHRo4buLIGRhbmggc8OhY2ggaOG7jWMgc2luaAp2b2lkIGhpZW5UaGlEYW5oU2FjaChIb2NTaW5oIGRzW10sIGludCBuKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIGNvdXQgPDwgZHNbaV0uaG9UZW4gPDwgIlx0IiA8PCBkc1tpXS5naW9pVGluaCA8PCAiXHQiIDw8IGRzW2ldLm5hbVNpbmggPDwgIlx0IiA8PCBkc1tpXS5kaWVtVG9uZ0tldCA8PCBlbmRsOwogICAgfQogICAgY291dCA8PCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iOwp9CgovLyAxLiBT4bqvcCB44bq/cCBwaMOibiDEkW/huqFuIChTaGVsbCBTb3J0KSB0aGVvIHTDqm4Kdm9pZCBzaGVsbFNvcnQoSG9jU2luaCBkc1tdLCBpbnQgbikgewogICAgZm9yIChpbnQgZ2FwID0gbiAvIDI7IGdhcCA+IDA7IGdhcCAvPSAyKSB7CiAgICAgICAgZm9yIChpbnQgaSA9IGdhcDsgaSA8IG47IGkrKykgewogICAgICAgICAgICBIb2NTaW5oIHRlbXAgPSBkc1tpXTsKICAgICAgICAgICAgaW50IGo7CiAgICAgICAgICAgIGZvciAoaiA9IGk7IGogPj0gZ2FwICYmIGRzW2ogLSBnYXBdLmhvVGVuID4gdGVtcC5ob1RlbjsgaiAtPSBnYXApIHsKICAgICAgICAgICAgICAgIGRzW2pdID0gZHNbaiAtIGdhcF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZHNbal0gPSB0ZW1wOwogICAgICAgIH0KICAgIH0KfQoKLy8gMi4gU+G6r3AgeOG6v3AgdnVuIMSR4buRbmcgKEhlYXAgU29ydCkgdGhlbyBuxINtIHNpbmggZ2nhuqNtIGThuqduCnZvaWQgaGVhcGlmeShIb2NTaW5oIGRzW10sIGludCBuLCBpbnQgaSkgewogICAgaW50IGxhcmdlc3QgPSBpOwogICAgaW50IGxlZnQgPSAyICogaSArIDE7CiAgICBpbnQgcmlnaHQgPSAyICogaSArIDI7CgogICAgaWYgKGxlZnQgPCBuICYmIGRzW2xlZnRdLm5hbVNpbmggPiBkc1tsYXJnZXN0XS5uYW1TaW5oKQogICAgICAgIGxhcmdlc3QgPSBsZWZ0OwoKICAgIGlmIChyaWdodCA8IG4gJiYgZHNbcmlnaHRdLm5hbVNpbmggPiBkc1tsYXJnZXN0XS5uYW1TaW5oKQogICAgICAgIGxhcmdlc3QgPSByaWdodDsKCiAgICBpZiAobGFyZ2VzdCAhPSBpKSB7CiAgICAgICAgc3dhcChkc1tpXSwgZHNbbGFyZ2VzdF0pOwogICAgICAgIGhlYXBpZnkoZHMsIG4sIGxhcmdlc3QpOwogICAgfQp9Cgp2b2lkIGhlYXBTb3J0KEhvY1NpbmggZHNbXSwgaW50IG4pIHsKICAgIGZvciAoaW50IGkgPSBuIC8gMiAtIDE7IGkgPj0gMDsgaS0tKQogICAgICAgIGhlYXBpZnkoZHMsIG4sIGkpOwogICAgCiAgICBmb3IgKGludCBpID0gbiAtIDE7IGkgPiAwOyBpLS0pIHsKICAgICAgICBzd2FwKGRzWzBdLCBkc1tpXSk7CiAgICAgICAgaGVhcGlmeShkcywgaSwgMCk7CiAgICB9Cn0KCi8vIDMuIFPhuq9wIHjhur9wIHRy4buZbiAoTWVyZ2UgU29ydCkgdGhlbyDEkWnhu4NtIHThu5VuZyBr4bq/dCB0xINuZyBk4bqnbgp2b2lkIG1lcmdlKEhvY1NpbmggZHNbXSwgaW50IGxlZnQsIGludCBtaWQsIGludCByaWdodCkgewogICAgaW50IG4xID0gbWlkIC0gbGVmdCArIDE7CiAgICBpbnQgbjIgPSByaWdodCAtIG1pZDsKCiAgICBIb2NTaW5oIExbbjFdLCBSW24yXTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjE7IGkrKykKICAgICAgICBMW2ldID0gZHNbbGVmdCArIGldOwogICAgZm9yIChpbnQgaiA9IDA7IGogPCBuMjsgaisrKQogICAgICAgIFJbal0gPSBkc1ttaWQgKyAxICsgal07CgogICAgaW50IGkgPSAwLCBqID0gMCwgayA9IGxlZnQ7CiAgICB3aGlsZSAoaSA8IG4xICYmIGogPCBuMikgewogICAgICAgIGlmIChMW2ldLmRpZW1Ub25nS2V0IDw9IFJbal0uZGllbVRvbmdLZXQpIHsKICAgICAgICAgICAgZHNba10gPSBMW2ldOwogICAgICAgICAgICBpKys7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZHNba10gPSBSW2pdOwogICAgICAgICAgICBqKys7CiAgICAgICAgfQogICAgICAgIGsrKzsKICAgIH0KCiAgICB3aGlsZSAoaSA8IG4xKSB7CiAgICAgICAgZHNba10gPSBMW2ldOwogICAgICAgIGkrKzsgaysrOwogICAgfQogICAgd2hpbGUgKGogPCBuMikgewogICAgICAgIGRzW2tdID0gUltqXTsKICAgICAgICBqKys7IGsrKzsKICAgIH0KfQoKdm9pZCBtZXJnZVNvcnQoSG9jU2luaCBkc1tdLCBpbnQgbGVmdCwgaW50IHJpZ2h0KSB7CiAgICBpZiAobGVmdCA8IHJpZ2h0KSB7CiAgICAgICAgaW50IG1pZCA9IGxlZnQgKyAocmlnaHQgLSBsZWZ0KSAvIDI7CiAgICAgICAgbWVyZ2VTb3J0KGRzLCBsZWZ0LCBtaWQpOwogICAgICAgIG1lcmdlU29ydChkcywgbWlkICsgMSwgcmlnaHQpOwogICAgICAgIG1lcmdlKGRzLCBsZWZ0LCBtaWQsIHJpZ2h0KTsKICAgIH0KfQoKaW50IG1haW4oKSB7CiAgICBIb2NTaW5oIGRhbmhTYWNoW10gPSB7CiAgICAgICAgeyJOZ3V5ZW4gVmFuIEEiLCAiTmFtIiwgMjAwNSwgOC41fSwKICAgICAgICB7IlRyYW4gVGhpIEIiLCAiTnUiLCAyMDA0LCA3LjJ9LAogICAgICAgIHsiTGUgVmFuIEMiLCAiTmFtIiwgMjAwNiwgOS4wfSwKICAgICAgICB7IlBoYW0gVGhpIEQiLCAiTnUiLCAyMDAzLCA2Ljh9LAogICAgICAgIHsiSG9hbmcgVmFuIEUiLCAiTmFtIiwgMjAwNSwgNy41fQogICAgfTsKICAgIGludCBuID0gc2l6ZW9mKGRhbmhTYWNoKSAvIHNpemVvZihkYW5oU2FjaFswXSk7CiAgICAKICAgIGNvdXQgPDwgIkRhbmggc2FjaCBiYW4gZGF1OlxuIjsKICAgIGhpZW5UaGlEYW5oU2FjaChkYW5oU2FjaCwgbik7CiAgICAKICAgIC8vIFPhuq9wIHjhur9wIHRoZW8gdMOqbiAodOG7qyDEkWnhu4NuKQogICAgc2hlbGxTb3J0KGRhbmhTYWNoLCBuKTsKICAgIGNvdXQgPDwgIkRhbmggc2FjaCBzYXAgeGVwIHRoZW8gdGVuOlxuIjsKICAgIGhpZW5UaGlEYW5oU2FjaChkYW5oU2FjaCwgbik7CiAgICAKICAgIC8vIFPhuq9wIHjhur9wIHRoZW8gbsSDbSBzaW5oIChnaeG6o20gZOG6p24pCiAgICBoZWFwU29ydChkYW5oU2FjaCwgbik7CiAgICBjb3V0IDw8ICJEYW5oIHNhY2ggc2FwIHhlcCB0aGVvIG5hbSBzaW5oIChnaWFtIGRhbik6XG4iOwogICAgaGllblRoaURhbmhTYWNoKGRhbmhTYWNoLCBuKTsKICAgIAogICAgLy8gU+G6r3AgeOG6v3AgdGhlbyDEkWnhu4NtIHThu5VuZyBr4bq/dCAodMSDbmcgZOG6p24pCiAgICBtZXJnZVNvcnQoZGFuaFNhY2gsIDAsIG4gLSAxKTsKICAgIGNvdXQgPDwgIkRhbmggc2FjaCBzYXAgeGVwIHRoZW8gZGllbSB0b25nIGtldCAodGFuZyBkYW4pOlxuIjsKICAgIGhpZW5UaGlEYW5oU2FjaChkYW5oU2FjaCwgbik7CiAgICAKICAgIHJldHVybiAwOwp9Cg==