Tải bản đầy đủ (.docx) (2 trang)

Kĩ thuật chia để trị trong kĩ thuật lập trình

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (45.56 KB, 2 trang )

THUẬT TOÁN QUY CHIA ĐỂ TRỊ
1. Mergesort : (đệ quy , ko đệ quy…)
1.1 Đệ quy :
//tách mảng a thành 2 phần gần bằng nhau
//kết quả chứa trong 2 mảng b và c
void tach(int a[], int na,
int b[], int &nb,
int c[], int &nc)
{
for(int i=0; i<na/2; i++) //bỏ nửa đầu của a vào b
b[i] = a[i];
for(int i=na/2; i<na; i++)//bỏ phần còn lại của a vào c
c[i-na/2] = a[i];
nb = na/2; //tính toán số phần tử của b và c
nc = na - nb;
}
//trộn 2 mảng a, b đã có thứ tự (tăng)
//tạo thành mảng c cũng có thứ tự (tăng)
void tron(int a[], int na,
int b[], int nb,
int c[], int &nc)
{
int i=0, j=0, k=0; //i chạy trên a, j chạy trên b, k chạy trên c
while (i<na && j<nb){ //cả a và b còn phần tử
if (a[i]<b[j]) c[k++] = a[i++];
else c[k++] = b[j++];
}
//đổ phần còn lại của a vào c (nếu còn)
while (i<na) c[k++] = a[i++];
//đổ phần còn lại của b vào c (nếu còn)
while (j<nb) c[k++] = b[j++];


nc = na+nb;
}
void mergesort(int a[], int n)
{
int b[100],c[100],nb,nc;
if (n>1) {
tach(a,n,b,nb,c,nc); //tách a thành b và c
mergesort(b,nb); //sắp b tăng dần (đệ quy)
mergesort(c,nc); //sắp c tăng dần (đệ quy)
tron(b,nb,c,nc,a,n); //trộn b,c ngược trở vào a
}
}
1.2 Không đệ quy :
2. Quicksort :
2.1 Đệ quy:
//Quicksort
void QuickSort(int a[],int n)
{
QuickSortC(a,0,n-1);
}
void QuickSortC(int a[],int Left,int Right)
{
int i,j,mid;
i=Left;
j=Right;
mid=a[(int)(Left+Right)/2];
do
{
while(a[i]<mid && i<Right)i++;
while(a[j]>mid && j>Left)j ;

if(i<=j)
{
Swap(a[i],a[j]);
i++;
j ;
}
} while (i<=j);
if (Left<j)
QuickSortC(a,Left,j);
if(i<Right)
QuickSortC(a,i,Right);
}
void Swap(int &a,int &b){int tg=a;a=b;b=tg;}

×