1. Trang chủ
  2. » Thể loại khác

giai thuat sap xep nhanh

3 119 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 3
Dung lượng 191,72 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Giải thuật sắp xếp nhanh Quick Sort là một giải thuật hiệu quả cao và dựa trên việc chia mảng dữa liệu thành các mảng nhỏ hơn.. Giải thuật sắp xếp nhanh chia mảng thành hai phần bằng các

Trang 1

Giải thuật sắp xếp nhanh (Quick Sort)

Sắp xếp nhanh (Quick Sort) là gì ?

Giải thuật sắp xếp nhanh (Quick Sort) là một giải thuật hiệu quả cao và dựa trên việc chia mảng dữa liệu thành các mảng nhỏ hơn Giải thuật sắp xếp nhanh chia mảng thành hai

phần bằng cách so sánh từng phần tử của mảng với một phần tử được chọn gọi là phần

tử chốt (Pivot): một mảng bao gồm các phần tử nhỏ hơn hoặc bằng phần tử chốt và mảng

còn lại bao gồm các phần tử lớn hơn hoặc bằng phần tử chốt

Tiến trình chia này diễn ra tiếp tục cho tới khi độ dài của các mảng con đều bằng 1 Giải thuật sắp xếp nhanh tỏ ra khá hiệu quả với các tập dữ liệu lớn khi mà độ phức tạp trường hợp trung bình và trường hợp xấu nhất là O(nlogn) với n là số phần tử

Kỹ thuật chọn phần tử chốt trong giải thuật sắp xếp nhanh

(Quick Sort)

Kỹ thuật chọn phần tử chốt ảnh hưởng khá nhiều đến khả năng rơi vào các vòng lặp vô hạn đối với các trường hợp đặc biệt Tốt nhất là chọn phần tử chốt (pivot) nằm ở trung vị của danh sách Khi đó, sau log2(n) lần chia chúng ta sẽ đạt tới kích thước các mảng con bằng 1

Dưới đây là các cách chọn phần tử chốt:

• Chọn phần tử đứng đầu hoặc đứng cuối làm phần tử chốt

• Chọn phần tử đứng giữa danh sách làm phần tử chốt

• Chọn phần tử trung vị trong ba phần tử đứng đầu, đứng giữa và đứng cuối làm phần tử chốt

• Chọn phần tử ngẫu nhiên làm phần tử chốt Tuy nhiên cách này rất dễ dẫn đến khả năng rơi vào các trường hợp đặc biệt

Minh họa cách chia trong giải thuật sắp xếp nhanh (Quick Sort) Hình minh họa dưới đây minh họa cách tìm phần tử chốt trong mảng Ở đây, chúng ta chọn phần tử chốt đứng ở cuối danh sách

Trang 2

Phần tử chốt chia danh sách thành hai phần Và sử dụng đệ qui, chúng ta tìm phần tử chốt

cho các mảng con cho tới khi danh sách chỉ còn một phần tử

Giải thuật phần tử chốt trong sắp xếp nhanh (Quick Sort)

Dựa vào cách chia danh sách trong giải thuật sắp xếp nhanh ở trên, chúng ta có thể viết

một giải thuật như dưới đây

Bước 1: Chọn phần tử chốt là phần tử có chỉ mục cao nhất (phần tử ở cuối danh

sách) Bước 2: Khai báo hai biến để trỏ tới bên trái và bên phải của danh sách,

ngoại trừ phần tử chốt Bước 3: Biến bên trái trỏ tới mảng con bên trái Bước 4:

Biến bên phải trỏ tới mảng con bên phải Bước 5: Khi giá trị tại biến bên trái

là nhỏ hơn phần tử chốt thì di chuyển sang phải Bước 6: Khi giá trị tại biến

bên phải là lớn hơn phần tử chốt thì di chuyển sang trái Bước 7: Nếu không

trong trường hợp cả bước 5 và bước 6 thì tráo đổi giá trị biến trái và phải

Bước 8: Nếu left ≥ right, thì đây chính là giá trị chốt mới

Giải thuật phần tử chốt mẫu trong sắp xếp nhanh (Quick Sort)

Từ các bước trên, chúng ta có thể suy ra code mẫu cho giải thuật sắp xếp nhanh (Quick

Sort) như sau:

B t đầ u h à m partitionFunc ( left , right , pivot ) leftPointer = left -

rightPointer = right while True th ự c hi ệ n while A [++ leftPointer ] <

pivot th ự c hi ệ n //không làm điều gì k ế t th ú c while while rightPointer > 0 && A [ rightPointer ] > pivot th ự c hi ệ n //không làm điều gì k ế t th ú c while if leftPointer >= rightPointer break else Trá o đổ i leftPointer , rightPointer k ế t th ú c if k ế t th ú c

while Trá o đổ i leftPointer , right return leftPointer K ế t th ú c

h m

Trang 3

Giải thuật sắp xếp nhanh (Quick Sort)

Sử dụng giải thuật phần tử chốt một cách đệ qui, chúng ta có thể kết thúc với các mảng

con nhỏ hơn Sau đó mỗi mảng con này có thể được xử lý với sắp xếp nhanh Dưới đây,

mình sử dụng giải thuật đệ qui cho sắp xếp nhanh:

Bước 1: Lấy phần tử chốt là phần tử ở cuối danh sách Bước 2: Chia mảng bởi sử

dụng phần tử chốt Bước 3: Sử dụng sắp xếp nhanh một cách đệ qui với mảng con

bên trái Bước 4: Sử dụng sắp xếp nhanh một cách đệ qui với mảng con bên phải

Giải thuật mẫu cho Sắp xếp nhanh (Quick Sort)

Từ phần giải thuật trên, chúng ta có thể suy ra code mẫu cho giải thuật sử dụng đệ qui cho

sắp xếp nhanh như sau:

B t đầ u h à m quickSort ( left , right ) if right - left <= return else pivot = A [ right ] partition = partitionFunc ( left , right , pivot )

quickSort ( left , partition - ) quickSort ( partition + , right ) k ế t th ú c

if K ế t th ú c h à m

Để theo dõi code đầy đủ của giải thuật sắp xếp nhanh trong ngôn ngữ C, mời bạn click

chuột vào chương: Sắp xếp nhanh (Quick Sort) trong C

Ngày đăng: 02/12/2017, 13:33

TỪ KHÓA LIÊN QUAN

w