Các lớp sắp xếpTrong 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.. 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ơ
Trang 1Cá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ớ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ắ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:
Trang 2void 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) {
void *tg, *di, *dj;
di= dia_chi(i);
538
Trang 3dj= 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:
void q_sort(int l, int r);
public:
540
Trang 4virtual 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*)); } ;
Trang 5void 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