Xem mẫu

  1. TS. Lê Minh Trung Th.S Lương Trần Ngọc Khiết Khoa CNTT, Đại học Sư phạm TP. HCM
  2. Nội dung  Chọn trực tiếp (Selection Sort)  Chèn trực tiếp (Insertion Sort)  Nổi bọt (Bubble Sort)  Merge Sort  Quick Sort  Heap Sort  Radix Sort
  3. Khái niệm  Sắp thứ tự:  Đầu vào: một mảng  Đầu ra: mảng có thứ tự tăng (hoặc giảm) trên khóa  Phân loại:  Sắp thứ tự ngoại (external sort): tập tin  Sắp thứ tự nội (internal sort): bộ nhớ  Giả thiết:  Sắp thứ tự nội  Sắp tăng dần
  4. Chọn trực tiếp  Input: int a[n]  Output: mảng đã được sắp xếp  Ý tưởng:  Với mỗi i=0, 1, 2,…, n-2  Tìm phần tử nhỏ nhất của mảng con a[i..n-1] và hoán vị phần tử này với a[i].
  5. Sorted Unsorted 23 78 45 8 32 56 Original List 8 78 45 23 32 56 After pass 1 8 23 45 78 32 56 After pass 2 After pass 3 8 23 32 78 45 56 8 23 32 45 78 56 After pass 4 After pass 5 8 23 32 45 56 78
  6. Chọn trực tiếp
  7. Chọn trực tiếp void SelectionSort(int a[], int n){ for(int i=0;i
  8. Đánh giá chọn trực tiếp  Vòng lặp for ngoài có n-1 lần lặp i=0,1,…,n-2  Số phép so sánh của lần lặp thứ i: n-i-1  Số phép so sánh: 𝑛−2 𝑛−1 𝑛  𝑆𝑆 = 𝑖=0 𝑛 − 𝑖 − 1 =𝑛 − 1 + 𝑛 − 2 + ⋯+ 1 = 2  Độ phức tạp của thuật toán: 𝑂 𝑛2
  9. Chèn trực tiếp (Insertion Sort)  Input: int a[n]  Output: mảng đã được sắp xếp  Ý tưởng:  Với mỗi i=1,2,…,n-1  Mảng con a[0..i-1] đã được sắp thứ tự tăng, chèn a[i] vào vị trí thích hợp để mảng con a[0..i] sắp thứ tự tăng.
  10. Sorted Unsorted 23 78 45 8 32 56 Original List 23 78 45 8 32 56 After pass 1 23 45 78 8 32 56 After pass 2 After pass 3 8 23 45 78 32 56 8 23 32 45 78 56 After pass 4 After pass 5 8 23 32 45 56 78
  11. Chèn trực tiếp
  12. Chèn trực tiếp void InsertionSort(int a[], int n){ for(int i=1;ix){ a[j+1]=a[j];j--; if(j==-1)break; } a[j+1]=x; } }
  13. Đánh giá chèn trực tiếp  Vòng lặp for ngoài có n-1 lần lặp i=1,2,…,n-1  Tốt nhất  𝑆𝑆 = 𝑛−1 𝑖=1 1 = 𝑛 − 1 ≈ 𝑂(𝑛)  Xấu nhất 𝑛−1  𝑆𝑆 = 𝑖=1 2𝑖 = 2 1 + 2 + ⋯ + 𝑛 − 1 = 𝑛(𝑛 − 1) ≈ 𝑂(𝑛2 )  Trung bình  𝑆𝑆 ≈ 𝑂(𝑛2 )
  14. Nổi bọt (Bubble Sort)  Input: int a[n]  Output: mảng đã được sắp xếp  Ý tưởng:  Với mỗi i=n-1, n-2,…, 1  Với mỗi j=0, 1,…, i  Nếu a[j]
  15. Nổi bọt sorted Bước 1 6 4 7 2 3 sorted Bước 2 4 6 2 3 7 sorted Bước 3 4 2 3 6 7 sorted Bước 4 2 3 4 6 7
  16. Nổi bọt void BubbleSort(int a[],int n){ for(int i=n-1;i>=1;i--){ for(int j=1; ja[j]){ int temp =a[j-1]; a[j-1]=a[j]; a[j] = temp; } } }
  17. Đánh giá Bubble Sort  Vòng lặp for ngoài có n-1 lần lặp i=n-1, n-2, …, 2, 1  Vòng lặp for trong có i lần lặp j=1, 2, …, i  Mỗi lần lặp có 1 phép so sánh, số phép so sánh: 𝑛−1 𝑛−1 𝑛  𝑆𝑆 = 𝑖=1 𝑖 = 1 + 2 + ⋯+ 𝑛 − 1 = ≈ 𝑂(𝑛2 ) 2  Độ phức tạp của thuật toán: 𝑂(𝑛2 )
  18. Cải tiến Bubble Sort  Cho phép nổi bọt theo hai chiều  Nổi bọt xuống, nổi bọt lên  Khi nổi bọt ghi nhận lại  Có sự nổi bọt thật sự hay không  exchange =false  mảng đã được sắp thứ tụ  Vị trí nổi bọt cuối cùng
  19. Bubble Sort cải tiến void BubbleSort(int a[],int n){ int iMax=n-1, jMax=0,t,k; bool exchange = true; do { exchange =false; for(int i=jMax;ia[i+1]){t=a[i]; a[i]=a[i+1]; a[i+1]=t;exchange=true;k=i;} iMax =k; if(!exchange)break; //nếu không có hoán vị nào trước đó thì thoát vì mảng đã được sắp thứ tự exchange = false; for(int i=iMax;i>jMax;i--) //nổi bọt lên if(a[i]
  20. Chia để trị  Ý tưởng:  Chia danh sách ra làm 2 phần  Sắp thứ tự riêng cho từng phần  Trộn 2 danh sách riêng đó thành danh sách có thứ tự  Hai giải thuật:  Merge sort:  Chia đều thành 2 danh sách  Sắp thứ tự riêng  Trộn lại  Quick sort:  Chia thành 3 phần: nhỏ, giữa (pivot), lớn  Sắp thứ tự riêng
nguon tai.lieu . vn