Đoạn chương trỡnh minh hoạ thủ tục QuickShort

Một phần của tài liệu giáo trình cấu trúc dữ liệu (Trang 38 - 41)

CÁC THUẬT TOÁN SẮP XẾP VÀ TèM KIẾM 3.1 Cỏc thuật toỏn tỡm kiếm

3.2.5.2.Đoạn chương trỡnh minh hoạ thủ tục QuickShort

Procedure sap_xep_nhanh(i,j:integer); Var K;integer ; Begin If i < j then Begin Phan_hoach(i,j,k); Sap_xep_nhanh(i,k-1); Sap_xep_nhanh(k+1,j); End; End;

3.2.5.3. Nhận xột và đỏnh giỏ giải thuật

Hiệu quả 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 làm mốc, khi đú dóy được phõn chia thành 2 phần bằng nhau và chỉ cần log(n) lần phõn hoạch thỡ sắp xếp xong. Nhưng nếu mỗi lần phõn hoạch lại chọn phải phần tử cú giỏ trị cực đại hay cực tiểu làm mốc, dóy sẽ bị phõn thành 2 phần khụng đều: một phần chỉ cú 1 phần tử,

phần cũn lại cú (n-1) phần tử, do vậy cần phõn hoạch n lần mới sắp xếp xong. Ta cú bảng tổng kết : Trường hợp Độ phức tạp Trung bỡnh n*log(n) Xấu nhất n2 3.2.5.4.Vớ dụ minh họa Cho dóy số a: 4 9 3 7 5 3 8

Cụng việc sắp xếp dóy trờn bằng thuật toỏn QuickSort được tiến hành như sau:

Phõn hoạch đoạn l = 0, r = 6, x = a[3] = 7

4 9 3 7 5 3 8

Phõn hoạch đoạn l = 0, r = 2, x = a[1] = 3

4 3 3 5 7 9 8

Phõn hoạch đoạn l = 4, r = 6, x = a[5] = 9

3 3 4 5 7 9 8

Dừng

3 3 4 5 7 8 9

TểM TẮT:

Trong chương này, chỳng ta đó xem xột cỏc thuật toỏn tỡm kiếm và sắp xếp thụng dụng. Cấu trỳc dữ liệu chớnh để minh hoạ cỏc thao tỏc này chủ yếu là mảng một chiều. Đõy cũng là một trong những cấu trỳc dữ liệu thụng dụng nhất.

Khi khảo sỏt cỏc thuật toỏn tỡm kiếm, chỳng ta đó làm quen với hai thuật toỏn. Thuật toỏn thứ nhất là thuật toỏn tỡm kiếm tuần tự. Thuật toỏn này

cú độ phức tạp tuyến tớnh (O(n)). Ưu điểm của nú là tổng quỏt và cú thể mở rộng để thực hiện cỏc bài toỏn tỡm kiếm đa dạng. Tuy nhiờn, chi phớ thuật toỏn khỏ cao nờn ớt khi được sử dụng. Thuật toỏn thứ hai là thuật toỏn nhị phõn tỡm kiếm. Thuật toỏn này cú ưu điểm là tỡm kiếm rất nhanh (độ phức tạp là log2N). Nhưng chỉ cú thể ỏp dụng đối với dữ liệu đó cú thứ tự theo khoỏ tỡm kiếm. Do đũi hỏi của thực tế, thao tỏc tỡm kiếm phải nhanh vỡ đõy là thao tỏc cú tần suất sử dụng rất cao nờn thuật toỏn nhị phõn tỡm kiếm thường được dựng hơn thuật toỏn tỡm tuần tự. Chớnh vỡ vậy xuất hiện nhu cầu phỏt triển cỏc thuật toỏn sắp xếp hiệu quả.

Phần tiếp theo của chương này trỡnh bày cỏc thuật toỏn sắp xếp thụng dụng theo thứ tự từ đơn giản đến phức tạp (từ chi phớ cao đến chi phớ thấp).

Phần lớn cỏc thuật toỏn sắp xếp cơ bản dựa trờn sự so sỏnh giỏ trị giữa cỏc phần tử. Bắt đầu từ nhúm cỏc thuật toỏn cơ bản, đơn giản nhất. Đú là cỏc thuật toỏn chọn trực tiếp, chốn trực tiếp, nổi bọt, đổi chỗ trực tiếp. Cỏc thuật toỏn này đều cú một điểm chung là chi phớ thực hiện tỷ lệ với n2.

Tiếp theo, chỳng ta khảo sỏt một số cải tiến của cỏc thuật toỏn trờn. Nếu như cỏc thuật toỏn chốn nhị phõn (cải tiến của chốn trực tiếp), shaker sort (cải tiến của nổi bọt) ; tuy chi phớ cú ớt hơn cỏc thuật toỏn gốc nhưng chỳng vẫn chỉ là cỏc thuật toỏn thuộc nhúm cú độ phức tạp O(n2), thỡ thuật toỏn Shellsort (cải tiến của chốn trực tiếp), lại cú độ phức tạp nhỏ hơn hẳn thuật toỏn gốc. Thuật toỏn shell sort cú độ phức tạp O(nx) với 1<x<2.

Thuật toỏn Quick sort, như tờn gọi của mỡnh được đỏnh giỏ là thuật toỏn sắp xếp nhanh nhất trong số cỏc thuật toỏn sắp xếp dựa trờn nền tảng so sỏnh giỏ trị của cỏc phần tử. Từ thuật toỏn quick sort, ta cũng cú thể xõy dựng được một thuật toỏn hiệu quả tỡm phần tử trung vị (median) của một dóy số.

Người ta cũng chứng minh được rằng O(nlog2n) là ngưỡng chặn dưới của cỏc thuật toỏn sắp xếp dựa trờn nền tảng so sỏnh giỏ trị của cỏc phần tử. Để vượt qua ngưỡng này, ta cần phỏt triển thuật toỏn mới theo hướng khỏc cỏc thuật toỏn trờn. Radix sort là một thuật toỏn như vậy. Nú được phỏt triển dựa trờn sự mụ phỏng qui trỡnh phõn phối thư của những người đưa thư. Thuật toỏn này đại diện cho nhúm cỏc thuật toỏn sắp xếp cú độ

phức tạp tuyến tớnh. Tuy nhiờn, thường thỡ cỏc thuật toỏn này khụng thớch hợp cho việc cài đặt trờn cấu trỳc dữ liệu mảng một chiều.

Trờn thực tế dữ liệu cần thao tỏc cú thể rất lớn do vậy khụng thụng thường thỡ cỏc dữ liệu được lưu trờn bộ nhớ thứ cấp, tức trờn cỏc đĩa từ. Việc thực hiện cỏc thao tỏc sắp xếp trờn cỏc dữ liệu này đũi hỏi phải cú cỏc phương phỏp khỏc thớch hợp. Tuy nhiờn trong khuụn khổ giỏo trỡnh này, cỏc thuật toỏn trờn là tương đối khú. Do vậy, chỳng tụi chỉ giới thiệu qua cỏc phương phỏp sắp xếp ngoài như là bài đọc thờm trong phần phụ lục ở cuối sỏch.

Một phần của tài liệu giáo trình cấu trúc dữ liệu (Trang 38 - 41)