Chương 10 Một số chương trình hướng đối tượng trên C++ Các lớp sắp xếp

5 573 5
Chương 10 Một số chương trình hướng đối tượng trên C++ Các lớp sắp xếp

Đang tải... (xem toàn văn)

Thông tin tài liệu

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 trong mục § 7 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 đây cho phép sắp xế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ắp xếp bất kỳ. 1. Lớp sort là lớpsở 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ắp xế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ắp xế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ắp xế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ắp xế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ắp xế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ắp xế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ắp xế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ắp xế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)); } void hoan_vi(int i, int j) { 538 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 { private: 540 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 . 7 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. 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

Ngày đăng: 24/10/2013, 15:20

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan