Xem mẫu

  1. Cấu trúc dữ liệu và giải thuật Bài 6. Sắp xếp nhanh - Quick Sorts Lecturer: PhD. Ngo Huu Phuc Tel: 0438 326 077 Mob: 098 5696 580 Email: ngohuuphuc76@gmail.com 1 Ngo Huu Phuc, Le Quy Don Technical University
  2. Bài 6. Quick Sorts Nội dung: 6.1. Thuật toán QuickSort (6) 6.2. Ví dụ về QuickSort (7) 6.3. Hoạt động của QuickSort (6) 6.4. Hiệu quả của QuickSort (6) Tham khảo: 1. Intro to Algorithms Chapter 8 QuickSort.htm 2. Lecture 5 – quicksort.htm 3. Quick Sort.htm 4. Bài giảng của TS Nguyễn Nam Hồng 2 Ngo Huu Phuc, Le Quy Don Technical University
  3. 6.1. Thuật toán QuickSort (1/6)  Giải thuật Quick-sort là phương pháp sắp xếp dựa trên chiến lược chia để trị. x  Giải thuật gồm các bước:  Phép chia: chọn ngẫu nhiên một phần tử x làm khóa, chia tập dữ liệu S ban đầu thành 3 phần: x  L chứa các phần tử nhỏ hơn x  E chứa các phần tử bằng x L E G  G chứa các phần tử lớn hơn x  Bước lặp: sắp xếp 2 tập L và G  Hiệu chỉnh lại các tập L, E x và G 3 Ngo Huu Phuc, Le Quy Don Technical University
  4. 6.1. Thuật toán QuickSort (2/6) Các bước cơ bản của thuật toán:  Chia tập dữ liệu ban đầu thành 2 tập con:  sao cho, tất cả các phần tử bên trái nhỏ hơn tất cả các phần tử bên phải.  Sắp xếp 2 tập con một cách độc lập và nối chúng lại với nhau:  như vậy, ta được dãy đã sắp xếp. 4 Ngo Huu Phuc, Le Quy Don Technical University
  5. 6.1. Thuật toán QuickSort (3/6)  Với mỗi tập con trên, mỗi tập chia thành 02 tập con nếu có thể  như vậy, ta có tối đa 04 tập con.  tập các phần tử nhỏ nhất ở bên trái cùng, tập các phần tử lớn nhất ở bên phải cùng.  Lặp lại quá trình trên cho đến khi tập chỉ có 1 phần tử  nối tất cả các tập với nhau ta được dãy đã sắp xếp. 5 Ngo Huu Phuc, Le Quy Don Technical University
  6. 6.1. Thuật toán QuickSort (4/6)  Ta chia t ập dữ liệu ban đầu như sau:  Trên tập S, lấy mỗi phần tử y được lấy ra khỏi tập  Đưa phần tử y vào tập L, E hay G, tùy thuộc vào phép so sánh với khóa x  Với mỗi phép lấy 1 phần tử và đưa chúng vào tập tương ứng, độ phức tạp của phép toán đó là O(1).  Như vậy, phép chia dữ liệu của thuật toán QuickSort có độ phức tạp O(n). 6 Ngo Huu Phuc, Le Quy Don Technical University
  7. 6.1. Thuật toán QuickSort (5/6) 7 4 9 6 2 → 2 4 6 7 9 4 2 → 2 4 7 9 → 7 9 2→2 9→9 7 Ngo Huu Phuc, Le Quy Don Technical University
  8. 6.1. Thuật toán QuickSort (6/6) Việc thực thi giải thuật QuickSort được mô tả qua cây nhị phân:  Mỗi node biểu diễn một lần gọi đệ quy và lưu giữ:  Dãy chưa được sắp xếp và khóa.  Dãy sau khi sắp xếp.  Gốc của cây là lần gọi đệ quy đầu tiên.  Các lá của cây là lần gọi ứng với dãy con có kích thước 0 hoặc 1. 8 Ngo Huu Phuc, Le Quy Don Technical University
  9. 6.2. Ví dụ về QuickSort (1/7)  Chọn khóa 9 Ngo Huu Phuc, Le Quy Don Technical University
  10. 6.2. Ví dụ về QuickSort (2/7)  Phân chia dãy ban đầu bằng gọi đệ quy với khóa đã chọn. 10 Ngo Huu Phuc, Le Quy Don Technical University
  11. 6.2. Ví dụ về QuickSort (3/7)  Gọi đệ quy cho dãy con, với khóa mới 11 Ngo Huu Phuc, Le Quy Don Technical University
  12. 6.2. Ví dụ về QuickSort (4/7)  Tương tự, gọi đệ quy, sau đó nối kết quả. 12 Ngo Huu Phuc, Le Quy Don Technical University
  13. 6.2. Ví dụ về QuickSort (5/7)  Tương tự cho phần bên phải. 13 Ngo Huu Phuc, Le Quy Don Technical University
  14. 6.2. Ví dụ về QuickSort (6/7)  Gọi đệ quy cho dãy con, với khóa mới 14 Ngo Huu Phuc, Le Quy Don Technical University
  15. 6.2. Ví dụ về QuickSort (7/7)  Nối kết quả cho gốc của cây. 15 Ngo Huu Phuc, Le Quy Don Technical University
  16. 6.3. Hoạt động của QuickSort (1/6) Có thể mô tả như sau:  Với tập ban đầu, chọn 1 phần tử làm khóa.  Đổi chỗ phần tử đầu tiên với khóa.  Sử dụng 2 chỉ số i và j để duyệt phần còn lại trên dãy.  Chỉ số i tăng đến khi tại vị trí i đó, phần tử này có giá trị lớn hơn khóa. Chỉ số j giảm đến khi giá trị tại vị trí j nhỏ hơn khóa.  So sánh giữa i và j, nếu i
  17. 6.3. Hoạt động của QuickSort (2/6) Chọn khóa:  Ta có th ể chọn bất kỳ phần tử nào trong mảng làm khóa.  Nếu chọn phần tử đầu tiên của mảng làm khóa, lựa chọn này là tồi nếu mảng đã sắp xếp. Khi đó, một mảng con có 0 phần tử. Thông thường, chọn khóa gần với giữa của mảng với hi vọng lựa chọn này sẽ cho 2 mảng con có số phần tử gần bằng nhau. Hàm chọn vị trí có dạng: Việc chọn này cũng tùy ý, có int getkeyposition(int i,int j) thể sử dụng hàm random để chọn khóa. Hàm này có dạng: { int getkeyposition(int i, int j) return(( i+j )/ 2); { } return(random number in the range of i to j); } 17 Ngo Huu Phuc, Le Quy Don Technical University
  18. 6.3. Hoạt động của QuickSort (3/6) Xây dựng hàm đệ quy:  Hàm đệ quy cho giải thuật có thể gọi QSort(S, a, b) sắp dãy con trong dãy ban đầu S tử chỉ số a đến chỉ số b.  Với QSort(L, 0, n-1) sắp mảng L từ phần tử đầu tiên đến phần tử cuối n-1.  QSort(S, a, b) sẽ được gọi đệ quy cho các mảng con nhỏ hơn, với chỉ số thay đổi. 18 Ngo Huu Phuc, Le Quy Don Technical University
  19. 6.3. Hoạt động của QuickSort (4/6) Chia dữ liệu:  Với khóa đã chọn x  Tổ chức lại tập S sao cho:  S[a]…S[t-1] là các phần tử < x  S[t] = x  S[t+1]…S[b] là các phần tử > p 19 Ngo Huu Phuc, Le Quy Don Technical University
  20. 6.3. Hoạt động của QuickSort (5/6) #include "stdio.h" void inputdata(int list[],int n) #include "conio.h" { #define MAX 100 int i; void swap(int *x,int *y); printf("Nhap cac phan tu cho mang\n"); int getkeyposition(int i,int j); for(i=0;i
nguon tai.lieu . vn