Yêu cầu của bài toán: cho một mảng dữ liệu m[n] với nlà số phần tử trong mảng. Hãy sắp xếp các phần tử trong mảng theo một trật tự nào đó, giả sử là theo chiều tăng dần (với chiều giảm dần ta hoàn toàn có thể suy luận từ cách làm với chiều tăng dần).
Sắp xếp kiểu lựa chọn (Selection sort): ý tưởng của phương pháp là như sau ta cần thực hiện n–1 lượt sắp xếp, trong đó:
- Ở lượt sắp xếp đầu tiên ta so sánh phần tử đầu tiên của mảng m[0] với tất cả các phần tử đứng sau nó trong mảng (tức là các phần tử m[1], m[2]…m[n-1]). Nếu có giá trị m[i] nào đó (i = 1, 2,…n–1) nhỏ hơn m[0] thì ta hoán đổi giá trị giữa
m[0] và m[i] cho nhau. Rõ ràng sau lượt sắp xếp thứ nhất m[0] sẽ là phần tử có giá trị nhỏ nhất trong mảng.
- Ở lượt sắp xếp thứ 2 ta so sánh phần tử thứ 2 của mảng m[1] với tất cả các phần tử đứng sau nó trong mảng (tức là các phần tử m[2], m[3]…m[n-1]). Nếu có giá trị m[i] nào đó (i = 2, 3,…n–1) nhỏ hơn m[1] thì ta hoán đổi giá trị giữa m[1] và
m[i] cho nhau. Sau lượt sắp xếp thứ 2 thì m[1] sẽ là phần tử có giá trị nhỏ thứ 2 trong mảng.
Trang 73
- Ở lượt sắp xếp thứ kta so sánh phần tử thứ kcủa mảng là m[k-1] với tất cả các phần tử đứng sau nó trong mảng (tức là các phần tử m[k], m[k+1]…m[n-1]).
Nếu có giá trị m[i] nào đó (i = k, k+1,…n–1) nhỏ hơn m[k] thì ta hoán đổi giá trị giữa m[k] và m[i] cho nhau. Sau lượt sắp xếp thứ k thì m[k-1] sẽ là phần tử có giá trị nhỏ thứ ktrong mảng.
…
- Ở lượt sắp xếp thứ n-1 ta so sánh phần tử thứ n-1 của mảng m[n-2] với tất cả các phần tử đứng sau nó trong mảng (tức là phần tử m[n-1]). Nếu m[n-1] nhỏ hơn m[n-2] thì ta hoán đổi giá trị giữa m[n-2] và m[n-1] cho nhau. Sau lượt sắp xếp thứ n-1 thì m[n-2] sẽ là phần tử có giá trị nhỏ thứ n-2 trong mảng. Và dĩ nhiên phần tử còn lại là m[n-1] sẽ là phần tử nhỏ thứ n trong mảng (tức là phần tử lớn nhất trong mảng). Kết thúc n-1 lượt sắp xếp ta có các phần tử trong mảng đã được sắp xếp theo thứ tự tăng dần.
Cài đặt giải thuật #include <stdio.h> #include <conio.h> void main() { int m[100]; int n; // n la số phần tử trong mảng int i, j, k;
clrscr(); // xóa màn hình đểtiện theo dõi // Nhập giá trị dữ liệu cho mảng m
// Trước tiên phải biết số phần tử của mảng printf(“ Cho biet so phan tu co trong mang: “); scanf(“%d”,&n);
// Rồi lần lượt nhập giá trị cho các phần tử trong mảng
for(i = 0;i<n;i++) {
int temp;
printf(“\n Cho biet gia tri cua m[%d] = “,i);
scanf(“%d”,&temp);
m[i] = temp;
}
// Hiển thị ra màn hình mảng vừa nhập vào printf(“\n Mang truoc khi sap xep: “);
for(i=0;i<n;i++) printf(“%3d”,m[i]); // Bắt đầu sắp xếp for(i = 0; i<n-1;i++) { // Ở lượt sắp xếp thứ i+1
Trang 74
for(j = i+1;j<n;j++)
{
// So sánh m[i] với các phần tử còn lại // và đổi chỗ khi tìm thấy phần tử < m[i].
if(m[j]<m[i])
{
int temp;
temp = m[j]; m[j] = m[i]; m[i] = temp;
}
}
// Hiển thị mảng sau lượt sắp xếp thứ i+1 printf(“\n Mang o luot sap xep thu %d”,i+1);
for(k = 0;k < n ;k++) printf(“%3d”,m[k]); } getch(); // Chờ người sử dụng ấn phím bất kì để kết thúc. } Kết quả thực hiện:
Cho biet so phan tu co trong mang: 5 Cho biet gia tri cua m[0]: 34
Cho biet gia tri cua m[1]: 20 Cho biet gia tri cua m[2]: 17 Cho biet gia tri cua m[3]: 65 Cho biet gia tri cua m[4]: 21
Mang truoc khi sap xep: 34 20 17 65 21 Mang o luot sap xep thu 1: 17 34 20 65 21 Mang o luot sap xep thu 2: 17 20 34 65 21 Mang o luot sap xep thu 3: 17 20 21 65 34 Mang o luot sap xep thu 4: 17 20 21 34 65