Các lớpsắpxếp Trong tệp C_SORT.H dưới đây sẽ chứa 4 lớpsắp xếp: sort, select_sort, quick_sort và heap_sort. tổng quát hơn. So với các lớpsắpxếp trong mục § 7 chương 6 thì cáclớp ở đây tổng quát hơn ở chỗ: + Cáclớp trong mục § 7 chương 6 chỉ cho phép sắpxếp một dẫy số nguyên theo thứ tự tăng dần. + Cáclớp dưới đây cho phép sắpxếp một dẫy phần tử có kiểu bất kỳ (nguyên, thực, cấu trúc, lớp, .) và theo một tiêu chuẩn sắpxếp bất kỳ. 1. Lớp sort là lớp cơ sở trừu tượng + Các thuộc tính: protected: void *a ; // Trỏ tới vùng nhớ chứa dẫy // phần tử cần sắpxếp int size ; // Độ lớn tính theo byte của phần tử int (*nho_hon)(void* pt1, void* pt2); // Con trỏ hàm // định nghĩa pt1 nhỏ hơn pt2 + Các phương thức: protected: void hoan_vi(int i, int j) ; // Hoán vị các phần tử thứ i và j void * dia_chi (int m); // Cho địa chỉ của phần tử thứ m public: virtual void sapxep(void *a1,int n,int itemsize, int (*ss_nho_hon)(void* ,void* )) ; // Sắpxếp dẫy // n phần tử chứa trong vùng nhớ a1, mỗi phần tử // có độ dài itemsize, thứ tự tăng được quy định // bởi hàm ss_nho_hon 2. Lớp select_sort dẫn xuất từ lớp sort. Lớp này sẽ thực hiện việc sắpxếp theo phương pháp chon (xem mục § 7 chương 6). + Các phương thức: public: virtual void sapxep(void *a1,int n,int itemsize, int (*ss_nho_hon)(void* ,void* )) ; // thực hiện // sắpxếp theo phương pháp chọn 3. Lớp quick_sort dẫn xuất từ lớp sort. Lớp này sẽ thực hiện việc sắpxếp theo phương pháp quick sort (xem mục § 7 chương 6) + Các phương thức: private: void q_sort(int l, int r); public: virtual void sapxep(void *a1,int n,int itemsize, int (*ss_nho_hon)(void* ,void* )) ; // thực hiện // sắpxếp theo phương pháp quick sort 4. Lớp heap_sort dẫn xuất từ lớp sort. Lớp này sẽ thực hiện việc sắpxếp theo phương pháp heap sort (xem mục § 7 chương 6). + Các phương thức: private: void shift(int i, int n); public: virtual void sapxep(void *a1,int n,int itemsize, int (*ss_nho_hon)(void* ,void* )) ; // thực hiện // sắpxếp theo phương pháp heap sort Dưới đây là nội dung tệp C_SORT.H //C_SORT.H // Lop co so truu tuong // Lop sort #include <conio.h> #include <stdio.h> #include <stdlib.h> #include <iostream.h> #include <iomanip.h> #include <mem.h> class sort { protected: void *a; int size; int (*nho_hon)(void*,void*); void* dia_chi(int m) { return (void*) ((char*)a + size*(m-1)); } 538 void hoan_vi(int i, int j) { void *tg, *di, *dj; di= dia_chi(i); dj= dia_chi(j); tg = new char[size]; memcpy(tg,di,size); memcpy(di,dj,size); memcpy(dj,tg,size); } public: virtual void sapxep(void *a1,int n,int itemsize, int (*ss_nho_hon)(void*,void*)) { a=a1; size=n; // Cho C++ hai long size=itemsize; nho_hon= ss_nho_hon; } } ; class select_sort : public sort { public: virtual void sapxep(void *a1,int n,int itemsize, int (*ss_nho_hon)(void*,void*)) ; } ; void select_sort::sapxep(void *a1,int n,int itemsize, int (*ss_nho_hon)(void*,void*)) { int i,j,r; sort::sapxep(a1,n,itemsize,ss_nho_hon); for(i=1; i<n; ++i) { r=i; for(j=i+1; j<=n; ++j) if(nho_hon(dia_chi(j),dia_chi(r))) r = j; if(r!=i) hoan_vi(i,r); } } class quick_sort : public sort 540 { private: void q_sort(int l, int r); public: virtual void sapxep(void *a1,int n,int itemsize, int (*ss_nho_hon)(void*,void*)) ; } ; void quick_sort::q_sort(int l, int r) { void *x; int i,j; x = new char[size]; if(l < r) { memcpy(x, dia_chi(l), size); i = l; j = r+1; do { ++i; --j; while(i<r && nho_hon(dia_chi(i),x)) ++i ; while(nho_hon(x,dia_chi(j)) ) --j ; if(i<j) hoan_vi(i,j); } while (i<j); hoan_vi(l,j); q_sort(l,j-1); q_sort(j+1,r); } } void quick_sort::sapxep(void *a1,int n,int itemsize, int (*ss_nho_hon)(void*,void*)) { sort::sapxep(a1,n,itemsize,ss_nho_hon); q_sort(1,n); } class heap_sort : public sort { private: void shift(int i, int n); public: virtual void sapxep(void *a1,int n,int itemsize, int (*ss_nho_hon)(void*,void*)); } ; void heap_sort::shift(int i, int n) { int l,r,k; l = 2*i; r = l+1; if(l>n) return; if(l==n) { if (nho_hon(dia_chi(i), dia_chi(l))) hoan_vi(i,l); return; } if(nho_hon(dia_chi(r), dia_chi(l))) k = l; else k = r; if (!nho_hon(dia_chi(i), dia_chi(k))) return; else { hoan_vi(i,k); shift(k,n); } } void heap_sort::sapxep(void *a1,int n,int itemsize, int (*ss_nho_hon)(void*,void*)) { long i; sort::sapxep(a1,n,itemsize,ss_nho_hon); // Tao dong for(i=n/2 ; i>=1; --i) shift(i,n); // Lap for(i=n ; i>=2; --i) { hoan_vi(1,i); shift(1,i-1); } } 542 . Các lớp sắp xếp Trong tệp C_SORT.H dưới đây sẽ chứa 4 lớp sắp xếp: sort, select_sort, quick_sort và heap_sort. tổng quát hơn. So với các lớp sắp xếp. chương 6 thì các lớp ở đây tổng quát hơn ở chỗ: + Các lớp trong mục § 7 chương 6 chỉ cho phép sắp xếp một dẫy số nguyên theo thứ tự tăng dần. + Các lớp dưới