Quick Sort

Màu nền
Font chữ
Font size
Chiều cao dòng

Ý tưởng: Chọn 1 phần tử làm phần tử chốt, giả sử là phần tử ak, phân hoạch dãy đã cho làm 2 phần: phần đầu gồm những phần tử không lớn hơn ak, phần sau gồm những phần tử lớn hơn ak, phần tử ak được đặt giữa 2 phần này, như vậy ak đã được đặt đúng vị trí của nó. Thực hiện tiếp quá trình này đối với mỗi đoạn con thu được cho đến đoạn con có độ dài < 2 ( có độ dài 0 hoặc 1) thì dừng lại. Vấn đề đặt ra là chọn phần tử chốt như thế nào để có thể phân hoạch đoạn đã cho thành 2 đoạn có độ dài ngang nhau. Nếu vai trò phần tử trong dãy như nhau thì có thể chọn phần tử bất kì, để đơn giản người ta thường chọn phần tử đầu của dãy cần phân hoạch. Câu hỏi đặt ra là phân hoạch như thế nào? Ta xét trường hợp tổng quát: Cần phân hoạch đoạn a[i...j] gồm các phần tử a[i]....a[j] với i < j. Chọn phần tử chốt là a[i], sau khi phân hoạch ta tìm được vị trí k để đặt phần tử chốt, tức là đoạn đã cho phân hoạch thành 2 đoạn con a[i...k-1] và a[k+1...j].

Giải thuật: Bước 1 : t=i; k=j+1;

Bước 2: cho t chạy sang phải đến khi gặp phần tử >a[i] hoặc t>j thì dừng lại. Cho k chạy sang trái đến khi gặp phần tử <= a[i] thì dừng lại.

Bước 3: Nếu t<k thì hoán vị 2 phần tử a[t] và a[k], quay lại bước 2.

Bước 4: Hoán vị a[i] và a[k].

Để sắp xếp dãy đã cho ta tiến hành phân hoạch liên tiếp theo giải thuật trên đến khi thu được các đoạn có độ dài < 2

Cài đặt: Void partition(int i, int j, int & k)

{ int t;

t=i, k=j+1

do t++; while ((t <=j) &&( a[t] <=a[i]));

do k--; while (a[k] >a[i]);

While (t<k)

{hoanvi (a[t],a[k]);

do t ++; while (a[t]<=a[i]);

do k--; while(a[k]>a[i]);

}

hoanvi(a[i],a[k]);

}

void quicksort(int t, int p)

{int k;

if (t<p)

{partition(t,p,k);

quicksor(t,k-1);

quicksort(k+1,p);

}

}

 Đánh giá: Trong trường hợp xấu nhất, mỗi lần phân hoạch thu được 1 đoạn con rỗng còn đoạn con  kia chứa hết các phần tử còn lại, nghĩa là phần tử chốt được đặt ở đầu đoạn. Trong trường hợp này sẽ phải cần đến n-1 lần phân hoạch, mà mỗi lần phân hoạch có độ phức tạp là O(n2). Trong trường hợp, số lần phân hoạch cỡ log2n, suy ra độ phức tạp của giải thuật trung bình và trường hợp tốt nhất là O(nlog2n).

Nhận xét: Chỉ trong những trường hợp xấu nhất độ phức tạp của giải thuật mới là O(n2) nhưng trường hợp xấu nhất xảy ra với xác xuất rất nhỏ, nên có thể kết luận độ phức tạp của giải thuật là O(nlog2n).

Bạn đang đọc truyện trên: Truyen2U.Pro