Sắp xếp và tỡm kiếm

Một phần của tài liệu Nghiên cứu công nghệ thành lập và ứng dụng bản đồ số địa chính trong điều kiện Việt Nam (Trang 57 - 59)

3.1.1.1. Sắp xếp nhanh

Trong cỏc thuật toỏn sắp xếp chỳng ta cần quan tõm đặc biệt đến những thuật toỏn cú độ phức tạp O(nlogn) như QuickSort (sắp xếp nhanh), HeapSort (sắp xếp vun đống), MergeSort (sắp xếp trộn),... Trong số cỏc thuật toỏn đó biết, QuickSort là thuật toỏn cú tốc độ trung bỡnh nhanh hơn cả, do đú nếu sử dụng QuickSort trong cỏc bài toỏn đũi hỏi sắp sếp một số lượng lớn cỏc đối tượng sẽ làm tăng đỏng kể hiệu suất của chương trỡnh. So với một số thuật toỏn sắp xếp khỏc như sắp xếp vun đống, sắp xếp trộn, ... độ ổn định của thuật toỏn QuickSort khụng cao. Vỡ vậy từ cỏc nghiờn cứu lý thuyết của QuickSort, khi sử dụng phải chủ động trỏnh cỏc tỡnh huống xấu hoặc trong trường hợp cần thiết biến đổi dữ liệu cho thớch hợp với thuật toỏn.

QuickSort là thuật toỏn được A.R. Hoare phỏt minh vào năm 1960. Cỏc ưu điểm của thuật toỏn Quick Sort là chỉ sử dụng một ngăn xếp phụ nhỏ, chỉ cần khoảng trung bỡnh O(nlogn) thao tỏc để sắp n phần tử, và cú một vũng lặp "trong" ngắn.

QuickSort thuộc loại "chia để trị" (divide and conquer). Nú thực hiện bằng cỏch phõn hoạch một tập tin thành hai phần, sau đú sắp xếp cỏc phần riờng biệt. Giả sử mảng cần sắp xếp là a(n), khi đú thuật toỏn QuickSort được thực hiện theo trỡnh tự sau: [27]

Hàm QuickSort (l, r) i = Phanhoach (l, r)

QuickSort (l, i-1); QuickSort (i+1, r)

Kết thỳc hàm

Tham số l và r khụng giới hạn cỏc tập tin con trong tập tin gốc cần sắp xếp; nếu gọi QuickSort(1,N) sẽ sắp toàn bộ tập tin.

Thủ tục "Phanhoach" sẽ tổ chức lại mảng thỏa món ba điều kiện sau: - Phần tử a(i) đặt ở vị trớ cuối cựng trong mảng với i nào đú.

- Tất cả cỏc phần tử trong a(l), ..., a(i-1) nhỏ hơn hay bằng a(i). - Tất cả cỏc phần tử trong a(i+1), ..., a(r) lớn hơn hay bằng a(i).

Đầu tiờn chọn tựy ý a(r) là phần tử sẽ rơi vào vị trớ đặt cuối cựng. Kế tiếp, quột từ trỏi của mảng cho đến khi gặp một phần tử lớn hơn a(r), và quột từ đầu phải cho đến khi gặp một phần tử nhỏ hơn a(r). Hai phần tử dừng việc quột dĩ nhiờn khụng đỳng vị trớ trong mảng được phõn hoạch cuối cựng nờn phải hoỏn vị chỳng (thực ra tốt nhất nờn ngừng việc quột đối với những phần tử bằng a(r), dự là cú thể đi vào một số hoỏn vị khụng cần thiết). Tiếp theo bảo đảm là tất cả cỏc phần tử trờn mảng ở bờn trỏi con trỏ phải lớn hơn a(r). Khi cỏc con trỏ giao nhau, quỏ trỡnh phõn hoạch gần như hoàn tất, cũn lại là hoỏn vị a(r) với phần tử trỏi nhất của tệp tin con bờn phải (phần tử do con trỏ trỏi trỏ đến).

Kết thỳc sắp xếp bằng cỏch sắp xếp hai tệp tin ở mỗi phớa của thuật toỏn phõn hoạch nhờ dựng vào đệ quy.

3.1.1.2. Tỡm kiếm nhị phõn

Tỡm kiếm nhị phõn cũng dựa trờn nguyờn tắc "chia để trị": chia mảng thành hai phần, xỏc định xem phần nào chứa khúa, kế đến tiếp tục quỏ trỡnh cho phần chứa khúa. Sở dĩ chỳng ta cú thể chia đụi và chỉ tiếp tục tỡm trờn một nửa mảng là nhờ vào giả thiết mảng đó được sắp xếp theo thứ tự khúa. Cú thể giả sử mảng được sắp xếp tăng, trường hợp sắp xếp giảm thỡ tương tự. Để tỡm khúa v cú trong mảng hay khụng, trước tiờn ta so sỏnh nú với phần tử

ở vị trớ giữa của mảng, nếu v nhỏ hơn thỡ nú chỉ cú thể ở trong một nửa đầu tiờn của mảng; nếu v lớn hơn thỡ nú chỉ cú thể ở trong một nửa cũn lại của mảng. Kế đến ỏp dụng đệ quy phương phỏp này. Bởi vỡ chỉ gọi đệ quy một lần, chỳng ta cú thể dựng phương phỏp lặp.

Giả sử mảng a đó được sắp xếp tăng theo thứ tự khúa, chỳng ta cú thể cài đặt hàm tỡm kiếm nhị phõn BinarySearch như sau:[27]

Hàm BinarySearch(v) L = 1; R = N ; X = (L + R) / 2 Làm tới khi (v = X) nếu v > X thỡ L = X nếu v < X thỡ R = X Lặp Kết thỳc hàm

Một phần của tài liệu Nghiên cứu công nghệ thành lập và ứng dụng bản đồ số địa chính trong điều kiện Việt Nam (Trang 57 - 59)