Cài đặt thuật tốn (bài tập)

Một phần của tài liệu Giáo trình cấu trúc dữ liệu và giải thuật (Trang 44 - 47)

Chú ý: Do tổng các mục dữ liệu trải trên các lơ B0, ..., B9 luơn bằng n, nên

cài đặt mỗi lơ bằng mảng là khơng hiệu quả. Khi đĩ, nếu dùng danh sách liên kết

động (xem chương tiếp) được cài đặt bởi con trỏsẽ hiệu quả hơn.

d. Độ phc tp ca thut tốn

- Thuật tốn RadixSort thực hiện m lần các thao tác phân bố dãy X vào các lơ và ghép các lơ trở lại dãy X. Trong mỗi thao tác này, mỗi phần tử được xét (tính địa chỉ một lần và hai phép gán) đúng một lần. Vậy độ phức tạp của thuật tốn (số phép hốn vị, trong cả 3 trường hợp về tình trạng dữ liệu, đều như nhau) là cỡ tuyến tính:

T(n) =

3 2

mn = O(n)

- Trên thực tế, thuật tốn cần thêm thời gian để tính tốn địa chỉ (trích chữ

số thứ k của phần tử nguyên) khi phân lơ. Việc cài đặt thuật tốn sẽ thuận tiện hơn nếu các phần tử cĩ dạng chuỗi (chi phí để trích ra phần tử thứ k ít hơn)

- Thuật tốn này sẽhiệu quả, nếu khĩa khơng quá dài

II.3.10. So sánh các phương pháp sắp xếp trong

Các phương pháp sắp xếp trực tiếp (chọn trực tiếp, nổi bọt, chèn trực tiếp), sắp xếp ShakerSort, nĩi chung, chúng đều cĩ độ phức tạp cỡ đa thức cấp 2:

Phương pháp sắp xếp ShellSort cĩ độ phức tạp tốt hơn: T(n) = O(n1,2).

Các phương pháp QuickSort, HeapSort trộn (tự nhiên) trong hầu hết trường hợp cĩ độ phức tạp tốt hơn nhiều:

T(n) = O(nlog2n)

Khác với cách tiếp cận của các phương pháp sắp xếp trên là dựa vào phép so sánh khố, phương pháp sắp xếp theo cơ sốRadixSort khơng dựa trên phép so sánh khĩa mà dựa vào việc phân loại các chữ số trong mỗi số của dãy số cĩ tối đa m chữ số. Khi đĩ, các phép tốn cơ bản lấy ra chữ số thứ k (1 k m) của mỗi số và phép gán các phần tử số. RadixSort cĩ độ phức tạp là:

T(n) = O(nm) = O(n)

* Các số liệu thực nghiệm vềthời gian (đơn vị là sao) chạy các thuật tốn

đã trình bày trên máy PC- Pentium III, 600MHz, 64 MB-RAM, theo các bộ số

liệu (dãy các số nguyên dương) cỡ: n = 130.000 và xét tình trạng dữ liệu trong 3 trường hợp: dãy ngẫu nhiên cĩ phân bốđều, dãy đã được sắp theo thứ tựthuận

ngược.

Ngẫu nhiên Thứ tự thuận Thứ tự ngược P.Pháp n 130000 Chậm Nhanh 130000 Chậm Nhanh 130000 Chậm Nhanh Chọn trực tiếp 23 909 x 23 794 X 30 029 x Chèn trực tiếp 11 326 x 6 X 32 384 x Ni bt 65 144 X 0 X 92 741 X Shaker Sort 39 689 X 0 X 59 215 X Shell Sort 33 X 11 X 11 X Heap Sort 16 X 11 X 11 X Quick Sort 11 X 5 X 5 X Trộn tự nhiên 27 X 5 X 22 X Radix Sort 286 x 264 x 253 x - Với bộ dữ liệu khá lớn gồm n = 5.000.000 số nguyên, ba phương pháp QuickSort, HeapSort và ShellSort tỏ ra xứng đáng là “đại diện” tốt cho 3 nhĩm phương pháp sắp xếp chính đã nêu ở trên (nĩ nhanh hơn hẳn so với các phương pháp khác trong cùng nhĩm).

Để ý rằng, cả 3 phương pháp đại diện này đều dựa trên ý tưởng “chia đơi”

(“chia để trị”). Với 3 phương pháp đại diện này, ta cĩ kết qủa thực nghiệm như

sau:

Ngẫu nhiên Thứ tự thuận Thứ tự ngược P.Pháp n 5*106 Chậm Nhanh 5*106 Chậm Nhanh 5*106 Chậm Nhanh

Shell Sort 1862 X 643 X 698 X

Heap Sort 1571 X 516 X 561 X

Quick Sort 489 X 291 x 297 X

Trên thực tế, với nhiều cơ sở dữ liệu lớn, số lần phải sắp xếp những bộ dữ

liệu ngẫu nhiên thường ít. Ta thường gặp tình huống phải sắp xếp lại các bộ dữ

liệu “gần được sắp” sau một số lần cập nhật trên bộ dữ liệu đã được sắp trước đĩ. Khi đĩ, QuickSort sắp trộn tự nhiên là hai phương pháp đáng lưu ý. Đặc biệt, thuật tốn sắp trộn tự nhiên cịn được sử dụng hiệu quả trên bộ nhớ ngồi.

Một phần của tài liệu Giáo trình cấu trúc dữ liệu và giải thuật (Trang 44 - 47)