Thuật toán sắp xếp nhanh - Quick Sort


Thuật toán sắp xếp nhanh - Quick Sort

Ý tưởng: 

Có dãy số: a1, a2, ..., an  

Giải thuật QuickSort làm việc như sau: 

Chọn x  là một phần tử làm biên: thường chọn là phần tử ở giữa dãy số.

Phân hoạc dãy thành 3 dãy con

1. ak <= x , với k = 1..i 

2. ak = x , với k =  i..j 

3. ak > =x , với k =  j..N 

 

Ak<=x 

Ak=x

Ak>=x


Nếu số phần tử trong dãy con 1, 3 lớn hơn 1 thì ta tiếp tục phân hoạch dãy 1, 3 theo phương pháp trên. Ngược lại thì: dừng.


Giải thuật phân hoạch dãy am, am+1, ., an thành 2 dãy con: 

Bước 1 : Chọn tùy ý một phần tử  a[k] trong dãy là giá trị biên,  m<= k <=n: 

x = a[k];   i = m;  j = n; 

Bước 2 : Phát hiện và hiệu chỉnh cặp phần tử  a[i], a[j] nằm sai vị trí: 

Bước 2a : Trong khi (a[i]<x) i++; 

Bước 2b : Trong khi (a[j]>x) j--; 

Bước 2c : Nếu  i<= j

// a[i]>= x;  a[j]<=x mà a[j] đứng sau a[i] 

Hoán vị (a[i],a[j]); 

        i++;

j--;

Bước 3 : 

Nếu  i <= j: Lặp lại Bước 2.//chưa xét hết mảng 

Ngược lại: Dừng


 Có thể phát biểu giải thuật sắp xếp QuickSort một cách đệ qui như sau : 


Bước 1 : Phân hoạch dãy am … an thành các dãy con : 

- Dãy con 1 : am.. aj  <= x 

- Dãy con 2 : aj+1.. ai-1  = x 

- Dãy con 1 : ai.. an  >= x

Bước 2 :  

Nếu ( m < j )  // dãy con 1 có nhiều hơn 1 phần tử 

Phân hoạch dãy am.. aj 

Nếu ( i < n )  // dãy con 3  có nhiều hơn 1 phần tử 
     Phân hoạch dãy ai.. ar

Ví dụ: 

Cho dãy số a: 

12   2 8 5 1 6 4 15 

Phân hoạch  đoạn l =1, r = 8: x = A[4] =5 

  Phân hoạch  đoạn l =1, r = 3: x = A[2] = 2   Phân hoạch  đoạn l = 5, r = 8: x = A[6] = 6   Phân hoạch  đoạn l = 7, r = 8: x = A[7] = 6   

Dừng. 

Cài đặt 




Ðánh giá giải thuật 

Hiệu qủa thực hiện của giải thuật QuickSort phụ thuộc vào việc chọn giá trị mốc. 

Trường hợp tốt nhất xảy ra nếu mỗi lần phân hoạch đều chọn được phần tử median (phần tử lớn hơn (hay bằng) nửa số phần tử, và nhỏ hơn (hay bằng) nửa số phần tử còn lại) làm mốc, khi đó dãy được phân chia thành 2 phần bằng nhau và cần log2(n) bước phân hoạch thì sắp xếp xong. 

Nhưng nếu mỗi bước phân hoạch phần tử được chọn có giá trị cực đại (hay cực tiểu) là mốc, dãy sẽ bị phân chia thành 2 phần không đều: một phần chỉ có 1 phần tử, phần còn lại gồm (n-1) phần tử, do vậy cần thực hiện n bước phân hoạch mới sắp xếp xong. Ta có bảng tổng kết 

Trường hợp 

Ðộ phức tạp 

Tốt nhất 

n*log(n) 

Xấu nhất 

n

Ntech Developers

Programs must be written for people to read, and only incidentally for machines to execute.

Post a Comment

Previous Post Next Post