http://vietjack.com/cau-‐truc-‐du-‐lieu-‐va-‐giai-‐thuat/index.jsp Copyright © vietjack.com Giải thuật xếp nhanh (Quick Sort) Sắp xếp nhanh (Quick Sort) ? Giải thuật xếp nhanh (Quick Sort) giải thuật hiệu cao dựa việc chia mảng dữa liệu thành mảng nhỏ Giải thuật xếp nhanh chia mảng thành hai phần cách so sánh phần tử mảng với phần tử chọn gọi phần tử chốt (Pivot): mảng bao gồm phần tử nhỏ phần tử chốt mảng lại bao gồm phần tử lớn phần tử chốt Tiến trình chia diễn tiếp tục độ dài mảng Giải thuật xếp nhanh tỏ hiệu với tập liệu lớn mà độ phức tạp trường hợp trung bình trường hợp xấu O(nlogn) với n số phần tử Kỹ thuật chọn phần tử chốt giải thuật xếp nhanh (Quick Sort) Kỹ thuật chọn phần tử chốt ảnh hưởng nhiều đến khả rơi vào vòng lặp vơ hạn trường hợp đặc biệt Tốt chọn phần tử chốt (pivot) nằm trung vị danh sách Khi đó, sau log2(n) lần chia đạt tới kích thước mảng Dưới cách chọn phần tử chốt: • Chọn phần tử đứng đầu đứng cuối làm phần tử chốt • Chọn phần tử đứng danh sách làm phần tử chốt • Chọn phần tử trung vị ba phần tử đứng đầu, đứng đứ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 dễ dẫn đến khả rơi vào trường hợp đặc biệt Minh họa cách chia giải thuật xếp nhanh (Quick Sort) Hình minh họa minh họa cách tìm phần tử chốt mảng Ở đây, chọn phần tử chốt đứng cuối danh sách http://vietjack.com/ Trang chia sẻ các bài học online miễn phí http://vietjack.com/cau-‐truc-‐du-‐lieu-‐va-‐giai-‐thuat/index.jsp Copyright © vietjack.com Phần tử chốt chia danh sách thành hai phần Và sử dụng đệ qui, tìm phần tử chốt cho mảng danh sách phần tử Giải thuật phần tử chốt xếp nhanh (Quick Sort) Dựa vào cách chia danh sách giải thuật xếp nhanh trên, viết giải thuật Bước 1: Chọn phần tử chốt phần tử có mục cao (phần tử cuối danh sách) Bước 2: Khai báo hai biến để trỏ tới bên trái bên phải 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 bên trái Bước 4: Biến bên phải trỏ tới mảng bên phải Bước 5: Khi giá trị biến bên trái nhỏ phần tử chốt di chuyển sang phải Bước 6: Khi giá trị biến bên phải lớn phần tử chốt di chuyển sang trái Bước 7: Nếu không trường hợp bước bước tráo đổi giá trị biến trái phải Bước 8: Nếu left ≥ right, giá trị chốt Giải thuật phần tử chốt mẫu xếp nhanh (Quick Sort) Từ bước trên, suy code mẫu cho giải thuật xếp nhanh (Quick Sort) sau: Bắt đầu hàm partitionFunc(left, right, pivot) leftPointer = left -1 rightPointer = right while True thực while A[++leftPointer] < pivot thực //khơng làm điều kết thúc while 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 http://vietjack.com/ Trang chia sẻ các bài học online miễn phí http://vietjack.com/cau-‐truc-‐du-‐lieu-‐va-‐giai-‐thuat/index.jsp Copyright © vietjack.com Giải thuật xếp nhanh (Quick Sort) Sử dụng giải thuật phần tử chốt cách đệ qui, kết thúc với mảng nhỏ Sau mảng xử lý với xếp nhanh Dưới đây, sử dụng giải thuật đệ qui cho xếp nhanh: Bước 1: Lấy phần tử chốt phần tử cuối danh sách Bước 2: Chia mảng sử dụng phần tử chốt Bước 3: Sử dụng xếp nhanh cách đệ qui với mảng bên trái Bước 4: Sử dụng xếp nhanh cách đệ qui với mảng 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, suy code mẫu cho giải thuật sử dụng đệ qui cho xếp nhanh sau: Bắt đầu hàm quickSort(left, right) if right-left