Cài đặt giải thuật

Một phần của tài liệu cau truc du lieu va giai thuat giaotrinh cuuduongthancong com (Trang 104 - 105)

Để cài đặt giải thuật, trƣớc hết ta xây dựng một thủ tục để sắp một phân đoạn của dãy. Thủ tục này là 1 thủ tục đệ qui, bao gồm việc chia phân đoạn thành 2 đoạn con thỏa mãn yêu cầu trên, sau đó thực hiện lời gọi đệ qui với 2 đoạn con vừa tạo đƣợc. Giả sử phân đoạn đƣợc giới hạn bởi 2 tham số là left và right cho biết chỉ số đầu và cuối của phân đoạn, khi đó thủ tục đƣợc cài đặt nhƣ sau:

void quick(int left, int right) {

Khoá i j

Khoá i j

int i,j; int x,y;

i=left; j=right; x= a[left]; 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) quick(left,j); if (i<right) quick(i,right); }

Tiếp theo, để thực hiện sắp toàn bộ dãy, ta chỉ cần gọi thủ tục trên với tham số left là chỉ số đầu và right là chỉ số cuối của mảng.

void quick_sort(){ quick(0, n-1); }

Nhƣợc điểm của Quick sort là hoạt động rất kém hiệu quả trên những dãy đã đƣợc sắp sẵn. Khi đó, cần phải mất N lần gọi đệ qui và mỗi lần chỉ loại đƣợc 1 phần tử. Thời gian thực hiện thuật toán trong trƣờng hợp xấu nhất này là khoảng N2/2, có nghĩa là O(N2).

Trong trƣờng hợp tốt nhất, mỗi lần phân chia sẽ đƣợc 2 nửa dãy bằng nhau, khi đó thời gian thực hiện thuật toán T(N) sẽ đƣợc tính là:

T(N) = 2T(N/2) + N Khi đó, T(N) ≈ NlogN.

Trong trƣờng hợp trung bình, thuật toán cũng có độ phức tạp khoảng 2NlogN = O(NlogN). Nhƣ vậy, quick sort là thuật toán rất hiệu quả trong đa số trƣờng hợp. Tuy nhiên, đối với các trƣờng hợp việc sắp xếp chỉ phải thực hiện một vài lần và số lƣợng dữ liệu cực lớn thì nên thực thi một số thuật toán khác có thời gian thực hiện trong mọi trƣờng hợp là O(NlogN), sẽ xem xét ở phần sau, để đảm bảo trƣờng hợp xấu nhất không xảy ra khi dùng quick sort.

Một phần của tài liệu cau truc du lieu va giai thuat giaotrinh cuuduongthancong com (Trang 104 - 105)

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

(153 trang)