Sắp xếp bằng phương pháp chọn Selection Sort Các thuật toán trong phần này sẽ tìm cách lựa chọn các phần tử thỏa mãn điều kiện chọn lựa để đưa về đúng vị trí của phần tử đó, cuối cùng tấ
Trang 1I X = 25 J
I X = 25
J
J Phân hoạch các phần tử trong dãy con từ First -> J:
First = 5 Last = J = 6 X = M[(5+6)/2] = M[5] = 20
First Last
X = 20 Phân hoạch:
X = 20 I≡J
X = 20
X = 20
Phân hoạch các phần tử trong dãy con từ I -> Last:
First = I = 7 Last = 10 X = M[(7+10)/2] = M[8] = 30
Phân hoạch:
I≡J
w
Trang 2X = 30
X = 30
X = 30 Phân hoạch các phần tử trong dãy con từ I -> Last:
First = I = 9 Last = 10 X = M[(9+10)/2] = M[9] = 55
First Last
X = 55 Phân hoạch:
X = 55
X = 55
Toàn bộ quá trình phân hoạch kết thúc, dãy M trở thành:
- Phân tích thuật toán:
+ Trường hợp tốt nhất, khi mảng M ban đầu đã có thứ tự tăng:
Số phép gán: Gmin = 1 + 2 + 4 + … + 2^[Log2(N) – 1] = N-1 Số phép so sánh: Smin = N×Log2(N)/2
Số phép hoán vị: Hmin = 0 + Trường hợp xấu nhất, khi phần tử X được chọn ở giữa dãy con là giá trị lớn nhất của dãy con Trường hợp này thuật toán QuickSort trở nên chậm chạp nhất:
Số phép gán: Gmax = 1 + 2 + … + (N-1) = N×(N-1)/2 Số phép so sánh: Smax = (N-1)×(N-1)
Số phép hoán vị: Hmax = (N-1) + (N-2) + … + 1 = N×(N-1)/2 + Trung bình:
Số phép gán: Gavg = [(N-1)+N(N-1)/2]/2 = (N-1)×(N+2)/4 Số phép so sánh: Savg = [N×Log2(N)/2 + N×(N-1)]/2 = N×[Log2(N)+2N–2]/4 Số phép hoán vị: Havg = N×(N-1)/4
w
Trang 33.2.2 Sắp xếp bằng phương pháp chọn (Selection Sort) Các thuật toán trong phần này sẽ tìm cách lựa chọn các phần tử thỏa mãn điều kiện chọn lựa để đưa về đúng vị trí của phần tử đó, cuối cùng tất cả các phần tử trong mảng M đều về đúng vị trí
Các thuật toán sắp xếp bằng phương pháp chọn bao gồm:
- Thuật toán sắp xếp chọn trực tiếp (straight selection sort),
- Thuật toán sắp xếp dựa trên khối/heap hay sắp xếp trên cây (heap sort)
Ở đây chúng ta chỉ trình bày thuật toán sắp xếp chọn trực tiếp
Thuật toán sắp xếp chọn trực tiếp (Straight Selection Sort):
- Tư tưởng:
+ Ban đầu dãy có N phần tử chưa có thứ tự Ta chọn phần tử có giá trị nhỏ nhất trong N phần tử chưa có thứ tự này để đưa lên đầu nhóm N phần tử
+ Sau lần thứ nhất chọn lựa phần tử nhỏ nhất và đưa lên đầu nhóm chúng ta còn lại N-1 phần tử đứng ở phía sau dãy M chưa có thứ tự Chúng ta tiếp tục chọn phần tử có giá trị nhỏ nhất trong N-1 phần tử chưa có thứ tự này để đưa lên đầu nhóm N-1 phần tử … Do vậy, sau N–1 lần chọn lựa phần tử nhỏ nhất để đưa lên đầu nhóm thì tất cả các phần tử trong dãy M sẽ có thứ tự tăng
+ Như vậy, thuật toán này chủ yếu chúng ta đi tìm giá trị nhỏ nhất trong nhóm N-K phần tử chưa có thứ tự đứng ở phía sau dãy M Việc này đơn giản chúng ta vận dụng thuật toán tìm kiếm tuần tự
- Thuật toán:
B1: K = 0 B2: IF (K = N-1) Thực hiện Bkt B3: Min = M[K+1]
B4: PosMin = K+1 B5: Pos = K+2 B6: IF (Pos > N) Thực hiện B8 B7: ELSE
B7.1: If (Min > M[Pos]) B7.1.1: Min = M[Pos]
B7.1.2: PosMin = Pos B7.2: Pos++
B7.3: Lặp lại B6 B8: HoánVị(M[K+1], M[PosMin]) B9: K++
B10: Lặp lại B2 Bkt: Kết thúc
- Cài đặt thuật toán:
Hàm SelectionSort có prototype như sau:
w
Trang 4void SelectionSort(T M[], int N);
Hàm thực hiện việc sắp xếp N phần tử có kiểu dữ liệu T trên mảng M theo thứ tự tăng dựa trên thuật toán sắp xếp chọn trực tiếp Nội dung của hàm như sau:
void SelectionSort(T M[], int N) { int K = 0, PosMin;
while (K < N-1) { T Min = M[K];
PosMin = K;
for (int Pos = K+1; Pos < N; Pos++)
if (Min > M[Pos]) { Min = M[Pos];
PosMin = Pos }
Swap(M[K], M[PosMin]);
K++;
} return;
}
- Ví dụ minh họa thuật toán:
Giả sử ta cần sắp xếp mảng M có 10 phần tử sau (N = 10):
Ta sẽ thực hiện 9 lần chọn lựa (N - 1 = 10 - 1 = 9) phần tử nhỏ nhất để sắp xếp mảng M:
Lần 1: Min = 1 PosMin = 1 K = 0 K+1
Lần 2: Min = 2 PosMin = 3 K = 1
K+1
K+1
Lần 3: Min = 5 PosMin = 7 K = 2
K+1
K+1
w
Trang 5Laàn 4: Min = 15 PosMin = 5 K = 3
K+1
K+1
Laàn 5: Min = 20 PosMin = 10 K = 4
K+1
K+1
Laàn 6: Min = 25 PosMin = 10 K = 5
K+1
K+1
Laàn 7: Min = 30 PosMin = 8 K = 6
K+1
K+1
Laàn 8: Min = 33 PosMin = 9 K = 7
K+1
K+1
Laàn 9: Min = 45 PosMin = 10 K = 8
K+1
w