1 / 45

Thuật Toán Sắp Xếp

Thuật Toán Sắp Xếp. HỒ ĐĂNG ĐỊNH. Nội dung trình bày gồm: +) nêu lên nhược điểm của bublesort từ đó đưa ra thuật toán cải tiến shakersort +) thuật toán sắp xếp nhanh. Thuật Toán Sắp Xếp. Ví dụ: sắp xếp dãy sau theo thứ tự tăng dần 5 6 8 7 11 9 10 12

akamu
Download Presentation

Thuật Toán Sắp Xếp

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Thuật Toán Sắp Xếp HỒ ĐĂNG ĐỊNH

  2. Nội dung trình bày gồm: +) nêu lên nhược điểm của bublesort từ đó đưa ra thuật toán cải tiến shakersort +) thuật toán sắp xếp nhanh

  3. Thuật Toán Sắp Xếp Ví dụ: sắp xếp dãy sau theo thứ tự tăng dần 5 6 8 7 11 9 10 12 Theo bạn kết quả sẻ như thế nào?

  4. Ví Dụ

  5. Đặt vấn đề • Bạn có nhận xét gì về bảng trên? • Có cần phải làm thêm lượt thứ 3 đến thứ 7 không ? • Tại sao bublesort lại thực hiện những bước này? • Bạn có nhận xét gì về tốc độ đưa các phần tử lớn và nhỏ về vị trí đúng?

  6. Nhược điểm của Bublesort: • Không nhận diện được tình trạng dãy có thứ tự hoặc có thứ tự từng phần • Các phần tử nhỏ được đưa về vị trí đúng rất nhanh còn phần tử lớn được đưa về vị trí đúng rất chậm • Chú ý: nếu ta biết được hoán vị sau cùng ở mỗi lượt thì ta có thể thu hẹp dãy đang xét nhanh hơn

  7. Thuật toán ShakerSort Ý tưởng: • Dựa trên nguyên tắc đổi chổ trực tiếp giống BubleSort nhưng tìm cách khắc phục nhược điểm của BubleSort với ý tưởng cải tiến như sau: +) lượt đi: đẩy phần tử nhỏ về đầu mảng +) lượt về:đẩy phần tử lớn về cuối mảng

  8. Ví dụ : sắp xếp dãy số theo thứ tự tăng dần 10 9 11 4 5 3

  9. 10 9 11 4 5 3

  10. 10 9 11 4 3 5

  11. 10 9 11 3 4 5

  12. 10 9 3 11 4 5

  13. 10 3 9 11 4 5

  14. 3 10 9 11 4 5

  15. 3 9 10 11 4 5

  16. 3 9 10 4 11 5

  17. 3 9 10 4 5 11

  18. 3 9 4 5 11 10

  19. 3 4 9 10 5 11

  20. 3 4 9 5 10 11

  21. Dãy được sắp xếp xong 3 4 5 9 10 11

  22. Giải thuật: Bước1: +) l=1; r =n;//từ l đến r là đoạn cần sắp xếp +) k=n;//ghi nhận vị trí xảy ra hoán vị sau cùng để làm cơ sở thu hẹp đoạn l đến r

  23. Bước 2: 2a) j=r //đẩy phần tử nhỏ về đầu mảng Trong khi (j>l) nếu a[j]<a[j-1] :hoán vị a[j] và a[j-1] k=j;//lưu nơi xảy ra hoán vị ở lượt đi j=j-1; l=k; //chỉ quan tâm các phần tử từ k trở về sau

  24. 2b)h=l;//đẩy phần tử lớn về cuối mảng Trong khi (h<r ) nếu a[h] >a[h+1] :hoán vị a[h] và a[h+1] k=h;//lưu lại nơi xảy ra hoán vị lượt về h=h+1;r=k;//chỉ quan tâm những phần tử từ r trở về l Bước 3: nếu (l<r) lặp lại bước 2

  25. Cài đặt:(theo ngôn ngữ pascal) Procedure shaker_sort(n:integer;var a:mang); Var h,l,r,k,j:integer; begin l:=1;r:=n;k:=n; while(l<r) do j:=r; while(j>l)do

  26. Begin if(a[j]<a[j-1]) then begin hoanvi(a[j],a[j-1]); k:=j; end; j:=j-1; End; l:=k;

  27. h:=l; while(h<r) do begin if(a[h]>a[h+1]) then begin hoanvi(a[h],a[h+1]); k:=h; end; h:=h+1;

  28. end; r:=k; end; end;

  29. Cài đặt:(theo ngôn ngữ C++) void shaker_sort(); { int h,l,r,k,j; l=0; r=n-1;k=n-1; while(l<r) { j = r; while(j>l) { if (a[j]<a[j-1]) { hoanvi(a[j],a[j-1]);

  30. k=j;} j--;} l=k; h=l; while(h<r) {if (a[h]>a[h+1]) { hoanvi(a[h],a[h+1]); k=h;} h++;} r=k;}

  31. Thuật toán sắp xếp nhanh Ý tưởng: trong dãy gồm n phần tử : +) chọn ra một phần tử bất kì làm mốc +)tìm vị trí đúng của phần tử mốc trong mảng +)chia mảng làm hai mảng con +)sử dụng thuật toán đệ quy để sắp xếp hai mảng con này

  32. Vấn đề được đặt ra Vậy thì tìm mốc như thế nào? Tim vị trí đúng của mốc ra làm sao?

  33. Cách chọn mốc Trong thực tế có rất nhiều cách chọn mốc chẳng hạn như: +) có thể chọn phần tử đầu mảng làm mốc +)hoặc có thể chọn phần tử ở giửa mảng Trong phần này chúng ta chỉ trình bày cách chọn phần tử đầu làm mốc

  34. Ý tưởng tìm vị trí đúng của mốc:(cho mảng(a[i],…..,a[j]) +)chọn phần tử đầu tiên làm mốc +)cho biến l chạy từ i đến cuối dãy còn biến k chạy từ j+1 đến về đầu dãy , biến l được tăng cho đến khi a[l] lớn hơn mốc,còn biến k giảm cho đến khi a[k]<= mốc +) nếu l<k thì hoán vị a[l] và a[k] +) lặp lại quá trình trên cho đến khi l>k +) cuối cùng ta hoán vị a[i] và a[k]

  35. Giải thuật: Giải thuật tổng quát: • Bước 1: chọn mốc a[k] thỏa :các giá trị bên trái của a[k] đều nhỏ hơn hoặc bằng a[k] còn giá trị bên phải lớn hơn a[k] • Bước 2: hai mảng con (a[i],…..,a[k-1]) và(a[k+1],….,a[j]) được sắp đệ quy

  36. Giải thuật phân đoạn:(cho (a[i]…a[j])) Bước 1: p=a[i];l=i;k=j+1; Bước 2: tăng l(l=l+1)cho tới khi (a[l]>p)hoặc (i>j) giảm k(k=k-1) cho đến khi (a[k]<=p) Bước 3: Trong khi (l<=k)thực hiện +)hoán vị (a[l],a[k]); +)tăng l cho đến khi (a[l]>p) +)giảm k cho tới khi (a[k]<=p) Bước 4: hoán vị(a[i] ,a[k])

  37. Cài đặt:(theo ngôn ngữ pascal) Procedure Partition(I,j:integer;var k:integer); Var l,p:integer; Begin p:=a[i];l:=I;k:=j+1; repeat (l:=l+1) until (a[l]>p)or(i>j); repeat (k:=k-1) until (a[k]<=p); While(l<k) do Begin hoanvi(a[l],a[k]); repeat (l:=l+1) until(a[l]>p); repeat (k:=k-1) until (a[k]<=p); End; Hoanvi(a[i],a[k]);End;

  38. Procedure Quick_sort(i,j:integer); Var k:integer; Begin if(i<j) then begin Partition(i,j,k);{chia đoạn ban đầu lam hai đoạn} Quick_sort(i,k-1); Quick_sort(k+1,j); end; End;

  39. Cài đặt:(theo ngôn ngữ C++) void Partition(int i,j); {int l,p; p=a[i];l=i;k=j+1; do l=l+1; while (a[l]<=p)&&(i<=j); do k=k-1; while(a[k]>p); while(l<k) {hoanvi(a[l],a[k]); do l=l+1; while(a[l]<=p); do k=k-1; while( a[k]>p);} hoanvi(a[i],a[k]); }

  40. Void Quick_sort( int i,j); { int k; if(i<j) { Partition(i,j,k); Quick_sort(i,k-1); Quick_sort(k+1,j); } }

  41. Ví dụ:sắp xếp theo thứ tự tăng dần dãy sau • 7 10 6 12 9 4 5 11 • Theo bạn kết quả sẻ như thế nào?

  42. Ví Dụ

  43. Đánh Giá Độ Phức Tạp Của Thuật Toán • Hiệu quả của thuật toán phụ thuộc vào việc chọn phần tử mốc +)Trường hợp tốt nhất:chọn được phần tử median (phần tử mà nhỏ hơn hoặc bằng một nửa số phần tử và lớn hơn một nửa số phần tử còn lại) +) Trường hợp xấu nhất:là phần tử chọn làm mốc của dãy là phần tử cực đại hay cực tiểu của dãy

  44. Bảng đánh giá độ phức tạp

  45. Phần báo cáo đến đây là kết thúc Chúc các bạn có một buổi chiều học tập vui vẻ và thành công Cảm ơn tất cả các bạn

More Related