SELECTION SORT
I.
II.
III.
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ỗ.
Ý 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à đầu dãy hiện hành
- Xem dãy hiện hành chỉ cịn (n-1) phần tử của dãy ban đầu
• Bắt đầu
10 23 2
5
34 1
8
10 23 2
5
34 1
8
từ vị trí i
0
1
2
3
4
5
6
thứ 2
B1: 1
23 2
5
34 10 8
• Lặp lại B2: 1
q trình trên cho dãy hiện hành…
2
23 5
34 10 8
đến khi B3: 1
dãy hiện hành còn 1 phần tử.
2
5
23 34 10 8
Minh họa:
B4: 1
2
5
8
34 10 23
Dãy a có 7 phần B5: 1
2
5
8
10 34 23 tử là 10, 23, 2, 5, 34, 1, 8. Sắp xếp
dãy a theo thứ B6: 1
2
5
8
10 23 34 tự tăng dần bằng thuật tốn sắp sếp
chọn
Bước 1: vị trí nhỏ nhất (0→6) là 1 đổi giá trị
a[0] vs a[5]
Bước 2: vị trí nhỏ nhất (1→6) là 2 đổi giá trị a[1] vs a[2]
Bước 3: vị trí nhỏ nhất (2→6) là 5 đổi giá trị a[2] vs a[3]
Bước 4: vị trí nhỏ nhất (3→6) là 8 đổi giá trị a[3] vs a[6]
Bước 5: vị trí nhỏ nhất (4→6) là 10 đổi giá trị
a[4] vs a[5]
Bước 6: vị trí nhỏ nhất (5→6) là 23 đổi giá trị
a[5] vs a[6]
Ta được 1 dãy mới 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ự sắp xếp là tăng dần.
o Ở lượt 1, chọn trong dãy khoá a[1..n] ra khố nhỏ nhất và đổi giá trị của nó với a[1].
Kết thúc lượt 1: a[1] trở thành khố có giá trị nhỏ nhất trong dãy khoá a[1..n].
o Ở các lượt thứ i tiếp theo, chọn trong dãy khoá a[i..n] ra khố nhỏ nhất và đổi giá trị
của nó với a[i]. Kết thúc lượt i: a[i] trở thành khố có giá trị nhỏ nhất trong dãy khoá
a[i..n].
o Sau n – 1 lượt, n – 1 khoá đã nằm đúng thứ tự, khố a[n] cịn lại sẽ là khố lớn nhất
và nằm ở vị trí cuối cùng trong dãy khố a[1..n].
Kết quả: dãy khoá đã được sắp 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 bằng giải thuật sắp 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 1. i ← 0
Bước 2. Tìm amin = min (ai, …., an-1)
Bước 3. amin ↔ ai
Bước 4. i ← i + 1
Nếu i < n-1: chuyển đến bước 2
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;
min = i;
for (int j = i + 1; j < n; j++)
{
if (a[min] > a[j])
min = 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 của giải thuật
a[min] > a[j]
Bước 2: Xác định số lần thực hiện của phép tốn tích cực
o Ở lượt thứ i, để tìm ra khố nhỏ nhất a[min] ln cần n - i phép so sánh.
o Số lượng n – i phép so sánh này khơng phụ thuộc vào tình trạng ban đầu của dãy khoá
a[1..n].
o Kết luận tổng số phép so sánh phải thực hiện trong các trường hợp tốt nhất, xấu nhất và
trung bình đều như nhau, và là:
Cmin = Cmax = CTb = = = 2
Bước 3: Kết luận độ phức tạp giải thuật
o Độ phức tạp giải thuật trong các trường hợp tốt nhất, xấu nhất và trung bình đều như nhau,
và là:
Tmin (n) = Tmax (n) = TTb(n) = O(n2)