1. Bài toán
Cho dãy X = {X1, X1, ..., Xn}, hãy sắp xếp dãy theo chiều không giảm.
2. Ý tưởng
3. Giải thuật
- Bước 1: i = 1;
- Bước 2: Tìm X[min] trong dãy X[i] ... X[n]
- Bước 3: Đỗi chổ X[i] cho X[min], nếu min trùng với i thì bỏ qua bước này.
- Bước 4:
* Nếu i <= n-1 thì tăng i lên 1 vị trí (i = i +1), quay lại Bước 2.
* Ngược lại, dừng, dãy đã cho đã sắp xếp đung vị trí.
4. Mã ngôn ngữ C
void SelectionSort(int X[], int n)
{
int min;
for(int i=0;i<n-1;i++)
{
min=i;
for(int j=i+1;j<n;j++)
if(X[j]<X[min]) min=j; // Tìm được vị trí chứa giá trị nhỏ nhất
swap(a[min],a[i]); // Đổi chổ min cho i
}
}
5. Ví dụ
X = {7, 2, 5, 4, 1, 3, 8, 6}
Dãy ban đầu 7, 2, 5, 4, 1, 3, 8, 6
i=1, min=5, swap(X[min],X[i]) ta có 1, 2, 5, 4, 7, 3, 8, 6
i=2, min=2, không đổi chổ ta có 1, 2, 5, 4, 7, 3, 8, 6
i=3, min=5, swap(X[min],X[i]) ta có 1, 2, 3, 4, 7, 5, 8, 6
i=4, min=4, không đổi chổ ta có 1, 2, 3, 4, 7, 5, 8, 6
i=5, min=6, swap(X[min],X[i]) ta có 1, 2, 3, 4, 5, 7, 8, 6
i=6, min=8, swap(X[min],X[i]) ta có 1, 2, 3, 4, 5, 6, 8, 7
i=7, min=8, swap(X[min],X[i]) ta có 1, 2, 3, 4, 5, 6, 7, 8 (dãy đã sắp xếp)
Thuật toán tốn thời gian gần như bằng nhau đối với mảng đã được sắp xếp cũng như mảng chưa được sắp xếp.
Insertion Sort và Selection Sort đều có chi phí cho trường hợp xấu nhất là O(n^2).
Insertion Sort tốt hơn Selection Sort nhất là khi mảng đã có thứ tự sẵn.
Các thuật toán sắp xếp khác:
0 nhận xét:
Đăng nhận xét
Click to see the code!
To insert emoticon you must added at least one space before the code.