Giải thuật Quick Sort

Một phần của tài liệu Bài giảng kỹ thuật lập trình (Trang 140 - 142)

Phương pháp sắp xếp kiểu phân đoạn là một cải tiến của phương pháp Selection Sort.

Đây là một phương pháp tốt do C.A.R. Hoare đưa ra và đặt tên cho nó là giải thuật Quick Sort.

Nội dung chủđạo của phương pháp này là chọn ngẫu nhiên một phần tử nào đó của dãy làm khoá chốt. Tính từ khoá chốt, các phần tử nhỏ hơn khoá phải được xếp vào trước chốt (đầu dãy), mọi phần tử sau chốt được xếp vào sau chốt (cuối dãy). Để làm được việc

đó, các phần tử trong dãy sẽđược so sánh với khoá chốt và tráo đổi vị trí cho nhau, hoặc cho khoá chốt nếu phần tửđó lớn hơn chốt mà lại nằm trước chốt hoặc nhỏ hơn chốt nhưng lại nằm sau chốt. Khi việc đổi chỗ lần đầu tiên đã thực hiện xong thì dãy hình thành hai

đoạn: một đoạn bao gồm các phần tử nhỏ hơn chốt, một đoạn gồm các phần tử lớn hơn chốt, còn chốt chính là vị trí của phần tử trong dãy được sắp xếp.

Áp dụng kỹ thuật như trên cho mỗi đoạn trước chốt và sau chốt cho tới khi các đoạn còn lại hai phần tử thì việc ghi nhớ không còn cần thiết nữa. Dãy sẽđược sắp xếp khi tất cả

các đoạn được xử lý xong. Ví dụ với dãy :

42 23 74 11 65 58 94 36 99 87

Ta chọn chốt đầu tiên là 42. Để phát hiện ra hai khoá cần đổi chỗ cho nhau, ta dùng hai biến i, j với giá trị ban đầu i=2, j=10. Nếu ki < 42 thì tiếp tục tăng i và lặp lại cho tới khi gặp phần tử thứ ki >42. Duyệt các phần tử thứ kjvới 42 nếu kj > 42 thì j giảm đi một, cho tới khi gặp phần tử thứkj <42 thì phần tử thứ kikj được đổi chỗ cho nhau. Quá trình sẽ được lặp lại với kikj cho tới khi i=j chính là vị trí dành cho khoá 42. Cuối cùng chúng ta

đổi chỗ42 cho khoá cho kj.

42 23 74 11 65 58 94 36 99 87 42 23 74 11 65 58 94 36 99 87 42 23 36 11 65 58 94 74 99 87 42 23 36 11 65 58 94 74 99 87 42 23 36 11 65 58 94 74 99 87 (i>j) 11 23 36 42 65 58 94 74 99 87 Như vậy, kết thúc lần thứ nhất, chúng ta được hai đoạn được phân biệt bởi khoá 42

như sau:

(11 23 36) [42] (65 58 94 74 99 87) Quá trình được lặp lại tương tự cho từng phân đoạn cho tới khi dãy được sắp xếp hoàn toàn. Chúng ta có thể cài đặt giải thuật bằng việc sử dụng stack hoặc đệ qui.

Độ phức tạp tính toán của giải thuật Quick Sort: Trường hợp tốt nhất Cmax = Ctb = O (n log2n) Truờng hợp xấu nhất Cmin= k.O(n2)

Sau đây là chương trình cài đặt giải thuật Quick Sort bằng phương pháp đệ qui. #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <alloc.h> #include <dos.h> void qs(int *, int ,int); void Quick(int *,int ); void Init(int *, int); void In(int *, int); void Init(int *A, int n){

int i;

printf("\n Tao lap day so:"); for (i=0; i<n;i++){

A[i]=random(1000); printf("%5d",A[i]); }

delay(1000); }

void Quick(int *A, int n){ qs(A,0,n-1); }

void qs(int *A, int left,int right) { register i,j;int x,y; i=left; j=right; x= A[(left+right)/2]; do {

while(A[i]<x && i<right) i++; while(A[j]>x && j>left) j--; if(i<=j){ y=A[i];A[i]=A[j];A[j]=y; i++;j--; } } while (i<=j); if (left<j) qs(A,left,j); if (i<right) qs(A,i,right); }

void In(int *A, int n){ register int i; for(i=0;i<n;i++)

delay(1000); }

void main(void){

int *A,n;clrscr();

printf("\n Nhap n="); scanf("%d",&n); A=(int *)malloc(n*sizeof(int)); Init(A,n);Quick(A,n);printf("\n"); In(A,n);getch();

free(A); }

Một phần của tài liệu Bài giảng kỹ thuật lập trình (Trang 140 - 142)

Tải bản đầy đủ (PDF)

(156 trang)