Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 25 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
25
Dung lượng
378,5 KB
Nội dung
Quick Sort Ý tưởng: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Giải thuật QuickSort xếp dãy a1, a2 , aN dựa việc phân hoạch dãy ban đầu thành phần : • Phần 1: Gồm phần tử có giá trị bé x • Phần 2: Gồm phần tử có giá trị x • Phần 3: Gồm phần tử có giá trị lớn x với x giá trị phần tử tùy ý dãy ban đầu Quick Sort - Ý Tưởng Sau thực phân hoạch, dãy ban đầu phân thành đoạn: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT • ak ≤ x , với k = j • ak = x , với k = j+1 i-1 • ak ≥ x , với k = i N CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Quick Sort – Ý Tưởng Đoạn thứ có thứ tự Nếu đoạn có phần tử : có thứ tự dãy ban đầu Quick Sort – Ý Tưởng CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Đoạn thứ có thứ tự Nếu đoạn có nhiều phần tử dãy ban đầu có thứ tự đoạn 1, Để xếp đoạn 3, ta tiến hành việc phân hoạch dãy theo phương pháp phân hoạch dãy ban đầu vừa trình bày … CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Giải Thuật Quick Sort IV. Quick sort Đây giả thuậtxếp nhanh, tốn O(nlogn) Cài đặt giả thuật tương đối phức tạp Chúng ta cần ý đến: Pivot: ta gọi chốt Partition: Gọi điểm phân hoạch Đối với giải thauật này, xem mảng phần tử hay mảng có tất phần tử giống mảng có thứ tự Ta chi mảng thành mảng con: Trái phải Sắpxếp mảng con, mảng phần tử Nếu mảng Trái có thứ tự mảng phải có thứ tự mảng mảng có thứ tự CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT A = {59, 31, 12, 33, 27, 97, 91, 19, 18, 63 } Bước 1: Tìm chốt: Chốt phần tử lớn phần tử khác mảng Nếu mảng có phần tử tất phần tử khơng có chốt: Chốt mảng la 59 (vị trí 0) VD: + 1, 1, 5, 3, -> chốt + 5, 5, 5, 3, 1, 2, -> chốt + -> khơng có chốt + 7, 7, 7, -> khơng có chốt CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Bước 2: Tìm điểm phân hoạch: + Dùng cờ: L (trái) R (Phải) + L chạy từ trái qua, dừng lại gặp phần tử >= pivot + R chạy từ phải qua, dừng lại gặp phần tử < pivot + Tại điểm dùng: Nếu L < R : Chúng ta swap A[L] A[R] + Dừng lại L > R + Partition L Đây số mảng bên phải CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT VD: với mảng A = {59, 31, 12, 33, 27, 97, 91, 19, 18, 63 } PivotLey = 59 L = 0, R = 9: b1 L dừng lại vị trí 0: A[L] >= pivot, R dừng lại vị trí 8, A[R] = 18 < pivot Swap: 18, 31, 12, 33, 27, 97, 91, 19, 59, 63 b2, tiếp tục L > R Bước 3: Lặp lại (Dùng đệ qui) Giải Thuật Quick Sort Bước 1: Nếu left ≥ right //dãy có phần tử Kết thúc; //dãy xếp CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Bước 2: Phân hoạch dãy aleft … aright thành đoạn: aleft aj, aj+1 ai-1, aright Đoạn ≤ x Đoạn 2: aj+1 ai-1 = x Đoạn 3: aright ≥ x Bước 3: Sắpxếp đoạn 1: aleft aj Bước 4: Sắpxếp đoạn 3: aright Giải Thuật Quick Sort Bước : Chọn tùy ý phần tử a[k] dãy giá trị mốc ( l ≤ k ≤ r): x = a[k]; i = l; j = r; CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Bước : Phát hiệu chỉnh cặp phần tử a[i], a[j] nằm sai chỗ : Bước 2a : Trong (a[i]x) j ; Bước 2c : Nếu i< j Swap(a[i],a[j]); Bước : Nếu i < j: Lặp lại Bước Ngược lại: Dừng 10 Quick Sort – Ví Dụ CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Cho dãy số a: 12 Phân hoạch đoạn l =0, r = 7: 12 l=0 15 x = a[3] = 15 r=7 11 Quick Sort – Ví Dụ i=0 j=6 CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT l=0 l=0 12 i=1 i=2 12 12 j=3 j=4 j=5 15 r=7 15 r=7 Quick Sort – Ví Dụ CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Phân hoạch đoạn l = 0, r = 2: l=0 i=0 r =3 j=2 13 12 15 Quick Sort – Ví Dụ Phân hoạch đoạn l =4, r = 7: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1 l=4 i=4 i=4 l=4 14 12 15 r =7 j=6 j=6 j=7 12 15 r =7 Quick Sort – Ví Dụ CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Phân hoạch đoạn l =6, r = 7: 15 12 15 CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Quick Sort void QuickSort(int a[], int left, int right) { int i, j, x; x = a[(left+right)/2]; i = left; j = right; { while(a[i] < x) i++; while(a[j] > x) j ; if(i