Chi tiết về phương pháp chia để trị trong kĩ thuật lập trình ví dụ chi tiết về phương pháp chia để trị ví dụ minh họa chi tiết rõ ràng code mẫu một số bài ví dụ thường gặp nhất khi học kĩ thuật lập trình
Trang 1THUẬ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);
}
Trang 2void 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;}