| Sắp xếp chọn |
 |
| Thông tin chung |
| Phân loại: |
Thuật toán sắp xếp |
| Cấu trúc dữ liệu: |
Ngẫu nhiên |
| Phức tạp thời gian: |
Trung bình  |
| Phức tạp dữ liệu: |
Không tốn thêm vùng nhớ |
| Tối ưu: |
Thỉnh thoảng |
|
Tư 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 tiên của dãy hiện hành. Sau đó không quan tâm đến nó nữa, xem dãy hiện hành chỉ còn n-1 phần tử của dãy ban đầu, bắt đầu từ vị trí thứ 2. Lặp lại quá trình trên cho dãy hiện hành đến khi dãy hiện hành chỉ còn 1 phần tử. Dãy ban đầu có n phần tử, vậy tóm tắt ý tưởng thuật toán là thực hiện n-1 lượt việc đưa phần tử nhỏ nhất trong dãy hiện hành về vị trí đúng ở đầu dãy.
Các bước thực hiện[sửa]
- Bước 1: i=1
- Bước 2: Tìm phần tử a[min] nhỏ nhất trong dãy hiện hành từ a[i] đến a[n]
- Bước 3: Hoán vị a[min] và a[i]
- Bước 4: Nếu i<=n-1 thì i=i+1; Lặp lại bước 2
- Ngược lại: Dừng. n-1 phần tử đã nằm đúng vị trí.
Ví dụ minh họa[sửa]
Ban đầu ta có mảng a với các giá trị:
Ví dụ code[sửa]
Void SelectionSort(int a[], int n)
{
int min;
for(int i=0;i<n-1;i++)
{
min=i;
for(int j=i+1;j<n;j++)
if(a[j]<a[min]) min=j;
HoanVi(a[min],a[i]);
}
}
Đánh giá[sửa]
- Thuật toán ít phải đổi chỗ các phần tử nhất trong số các thuật toán sắp xếp( n lần hoán vị ) nhưng có độ phức tạp so sánh là O(n2) (n2/2 phép so sánh).
- 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.
Xem thêm[sửa]
|
|
|
| Lý thuyết |
|
|
|
| Sắp xếp đổi chỗ |
|
|
| Sắp xếp chọn |
|
|
| Sắp xếp chèn |
|
|
| Sắp xếp trộn |
|
|
| Sắp xếp không so sánh |
|
|
| Các loại khác |
|
|