SELECTION SORT I Khái niệm sắp xếp chọn( selection sort) là kiểu sắp xếp đơn, dựa trên việc so sánh tại chỗ II Ý tưởng Chọn phần tử nhỏ nhất trong n phần tử ban đầu Đưa phần tử này về vị trí đúng là đ.
SELECTION SORT I II III Khái niệm: xếp chọn( selection sort) kiểu xếp đơn, dựa việc so sánh chỗ Ý tưởng: - Chọn phần tử nhỏ n phần tử ban đầu - Đưa phần tử vị trí đầu dãy hành - Xem dãy hành (n-1) phần tử dãy ban đầu • Bắt đầu 10 23 34 10 23 34 từ vị trí i thứ B1: 23 34 10 • Lặp lại B2: trình cho dãy hành… 23 34 10 đến B3: dãy hành phần tử 23 34 10 Minh họa: B4: 34 10 23 Dãy a có phần B5: 10 34 23 tử 10, 23, 2, 5, 34, 1, Sắp xếp dãy a theo thứ B6: 10 23 34 tự tăng dần thuật tốn sếp chọn Bước 1: vị trí nhỏ (0→6) đổi giá trị a[0] vs a[5] Bước 2: vị trí nhỏ (1→6) đổi giá trị a[1] vs a[2] Bước 3: vị trí nhỏ (2→6) đổi giá trị a[2] vs a[3] Bước 4: vị trí nhỏ (3→6) đổi giá trị a[3] vs a[6] Bước 5: vị trí nhỏ (4→6) 10 đổi giá trị a[4] vs a[5] Bước 6: vị trí nhỏ (5→6) 23 đổi giá trị a[5] vs a[6] Ta dãy theo thứ tự tăng dần IV Nguyên tắc thực hiện: Xét dãy khoá a[1 n] với thứ tự xếp tăng dần o Ở lượt 1, chọn dãy khoá a[1 n] khoá nhỏ đổi giá trị với a[1] Kết thúc lượt 1: a[1] trở thành khố có giá trị nhỏ dãy khoá a[1 n] o Ở lượt thứ i tiếp theo, chọn dãy khoá a[i n] khoá nhỏ đổi giá trị với a[i] Kết thúc lượt i: a[i] trở thành khố có giá trị nhỏ dãy khoá a[i n] o Sau n – lượt, n – khoá nằm thứ tự, khố a[n] cịn lại khố lớn nằm vị trí cuối dãy khoá a[1 n] Kết quả: dãy khoá xếp theo thứ tự tăng dần V Giải thuật: o Bài toán: Cho dãy a[1 n] gồm n phần tử ) o Yêu cầu: Sắp xếp dãy a theo thứ tự tăng dần giải thuật xếp kiểu lựa chọn (selection sort) o Kết quả: a[1] ≤ a[2] ≤ … ≤ a[n] o Thuật toán: Bước i ← Bước Tìm amin = (ai, …., an-1) Bước amin ↔ Bước i ← i + Nếu i < n-1: chuyển đến bước Ngược lại: dừng o Code: void selectionsort(int a[], int n) { int min; for (int i = 0; i < n-1; i++) { int temp; = i; for (int j = i + 1; j < n; j++) { if (a[min] > a[j]) = j; } if (a[min] < a[i]) { temp = a[i]; a[i] = a[min]; a[min] = temp; } } } VI Phân tích giải thuật: Bước 1: Xác định phép tốn tích cực giải thuật a[min] > a[j] Bước 2: Xác định số lần thực phép toán tích cực o Ở lượt thứ i, để tìm khố nhỏ a[min] ln cần n - i phép so sánh o Số lượng n – i phép so sánh khơng phụ thuộc vào tình trạng ban đầu dãy khoá a[1 n] o Kết luận tổng số phép so sánh phải thực trường hợp tốt nhất, xấu trung bình nhau, là: Cmin = Cmax = CTb = = = Bước 3: Kết luận độ phức tạp giải thuật o Độ phức tạp giải thuật trường hợp tốt nhất, xấu trung bình nhau, là: Tmin (n) = Tmax (n) = TTb(n) = O(n2) ...Nếu i < n-1: chuyển đến bước Ngược lại: dừng o Code: void selectionsort(int a[], int n) { int min; for (int i = 0; i < n-1; i++) { int temp; = i; for (int j =