Thuật toán sắp xếp chọn (Selection Sort) trong C / C++
Trong bài viết này, codehow sẽ giới thiệu đến các bạn thuật toán sắp xếp chọn (Selection Sort) trong C / C++. Đây là một thuật toán khá đơn giản, độ phức tạp không quá cao và chỉ nên áp dụng cho các tập dữ liệu vừa và nhỏ.
Trước khi đi vào tìm hiểu thuật toán sắp xếp chọn (Selection Sort) trong C / C++, các bạn cùng mình tìm hiểu qua về thuật toán sắp xếp chọn là gì? Cách nó hoạt động đã nhé.
Sắp xếp chọn (Selection Sort) là gì? Cách nó hoạt động
Nói một cách dễ hiểu hơn, mảng lớn sẽ chia thành hai mảng con. Một mảng con đã sắp xếp và một mảng con chưa sắp xếp. Thuật toán đi tìm giá trị nhỏ nhất và hoán đổi vị trí cho phần tử đầu tiên trong mảng con chưa sắp xếp. Cứ như vậy cho đến khi mảng con chưa sắp xếp không còn phần tử nào cả.
Sau mỗi lần lặp, phần tử nhỏ nhất ở mảng con chưa được sắp xếp sẽ được di chuyển về cuối mảng con đã sắp xếp.
Hãy xem hình minh họa dưới đây để hiểu rõ hơn.
Độ phức tạp của thuật toán không quá cao, chỉ ở mức O(n^2). Thuật toán này chỉ nên áp dụng cho các bài toán có tập dữ liệu vừa và nhỏ thôi nhé. Đối với các bài toán có tập dữ liệu lớn chúng ta nên sử dụng các thuật toán khác.
Thuật toán sắp xếp chọn (Selection Sort) trong C / C++
Thuật toán sắp xếp chọn (Selection Sort) sẽ hoán đổi hai vị trí của hai phần tử, vậy nên chúng ta cần có hàm Swap() để làm điều này.
void swap(int* a, int* b) { int temp; temp = *a; *a = *b; *b = temp; }
void swap(int &xp, int &yp) { int temp = xp; xp = yp; yp = temp; }
Sau khi có hàm Swap()
, chúng ta sẽ bắt đầu viết thuật toán sắp xếp chọn dưới đây.
void selectionSort(int arr[], int n) { int i, j, min_idx; // Di chuyển ranh giới của mảng đã sắp xếp và chưa sắp xếp for (i = 0; i < n-1; i++) { // Tìm phần tử nhỏ nhất trong mảng chưa sắp xếp min_idx = i; for (j = i+1; j < n; j++) if (arr[j] < arr[min_idx]) min_idx = j; // Đổi chỗ phần tử nhỏ nhất với phần tử đầu tiên swap(arr[min_idx], arr[i]); } }
Giải thích thuật toán:
- Sử dụng vòng lặp for, di chuyển giá trị nhỏ nhất về vị trí số 0.
- Sử dụng thêm một vòng lặp for để tìm phần tử nhỏ nhất trong mảng con chưa được sắp xếp.
- Hoán đổi phần tử đó cho vị trí đầu tiên tại mảng con chưa được sắp xếp.
- Di chuyển phần tử đầu tiên tại mảng con chưa được sắp xếp sang mảng con đã sắp xếp
- Tiếp tục vòng lặp cho đến khi mảng đã được sắp xếp hoàn toàn.
Dưới đây mình sẽ thực hiện một ví dụ minh họa sử dụng thuật toán sắp xếp chọn (Selection Sort) trong C / C++. Chương trình được viết bằng hai ngôn ngữ là C và C++, các bạn có thể tham khảo nhé.
Chương trình C:
#include <stdio.h> #include <stdbool.h> void swap(int* a, int* b) { int temp; temp = *a; *a = *b; *b = temp; } void selectionSort(int arr[], int n) { int i, j, min_idx; // Di chuyển ranh giới của mảng đã sắp xếp và chưa sắp xếp for (i = 0; i < n-1; i++) { // Tìm phần tử nhỏ nhất trong mảng chưa sắp xếp min_idx = i; for (j = i+1; j < n; j++) if (arr[j] < arr[min_idx]) min_idx = j; // Đổi chỗ phần tử nhỏ nhất với phần tử đầu tiên swap(&arr[min_idx], &arr[i]); } } void printArr(int arr[], int N) { int i; for (i = 0; i < N; i++) { printf("%d\t", arr[i]); } } int main(void) { int n; do{ printf("\nNhập vào số lượng phần tử có trong mảng: "); scanf("%d", &n); }while(n <= 0); int a[n]; for(int i = 0;i < n;i++){ printf("a[%d] = ",i); scanf("%d",&a[i]); }; selectionSort(a, n); printf("Mảng sau khi được sắp xếp: \n"); printArr(a, n); printf("\n---------------------------------------\n"); printf("Chương trình này được đăng tại codehow.net"); }
Kết quả:
Chương trình C++:
#include <iostream> using namespace std; void swap(int* a, int* b) { int temp; temp = *a; *a = *b; *b = temp; } void selectionSort(int arr[], int n) { int i, j, min_idx; // Di chuyển ranh giới của mảng đã sắp xếp và chưa sắp xếp for (i = 0; i < n-1; i++) { // Tìm phần tử nhỏ nhất trong mảng chưa sắp xếp min_idx = i; for (j = i+1; j < n; j++) if (arr[j] < arr[min_idx]) min_idx = j; // Đổi chỗ phần tử nhỏ nhất với phần tử đầu tiên swap(arr[min_idx], arr[i]); } } void printArr(int arr[], int N) { int i; for (i = 0; i < N; i++) { cout<<arr[i]<<"\t"; } } int main(void) { int n; do{ cout<<"\nNhập vào số lượng phần tử có trong mảng: "; cin>>n; }while(n <= 0); int a[n]; for(int i = 0;i < n;i++){ cout<<"a["<<i<<"] = "; cin>>a[i]; }; selectionSort(a, n); cout<<"Mảng sau khi được sắp xếp: \n"; printArr(a, n); cout<<"\n---------------------------------------\n"; cout<<"Chương trình này được đăng tại codehow.net"; }
Kết quả:
Như vậy là chúng ta đã cùng nhau tìm hiểu về thuật toán sắp xếp chọn (Selection Sort) trong C / C++. Ở bài viết tiếp theo, mình sẽ giới thiệu đến các bạn thuật toán sắp xếp trộn (Merge Sort) trong C / C++. Các bạn chú ý theo dõi nhé !!!