Tải bản đầy đủ (.docx) (2 trang)

sắp xếp chọn SELECTION SORT

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (66.62 KB, 2 trang )

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)



×