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

Một phần của tài liệu Bài giảng cấu trúc dữ liệu và giải thuật (2013) (Trang 106 - 107)

Để 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) { int i,j; int x,y; i=left; j=right; x= a[left]; Khoá i j Khoá i j Khoá j i

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.

7.4 HEAP SORT 7.4.1 Giới thiệu

Một phần của tài liệu Bài giảng cấu trúc dữ liệu và giải thuật (2013) (Trang 106 - 107)