LATEST

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

Thuật toán sắp xếp chọn (Selection Sort) thực hiện bằng cách đi tìm phần tử nhỏ nhất trong mảng chưa sắp xếp. Sau đó hoán đổi vị trí phần tử nhỏ nhất đó cho phần tử ở đầu đoạn chưa được sắp xếp (không phải đầu mả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.

bai13 01 gif

Độ 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.

Ngôn ngữ C
void swap(int* a, int* b)
{
   int temp;
   temp = *a;
   *a = *b;
   *b = temp;
}
Ngôn ngữ C++
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:

  1. Sử dụng vòng lặp for, di chuyển giá trị nhỏ nhất về vị trí số 0.
  2. 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.
  3. Hoán đổi phần tử đó cho vị trí đầu tiên tại mảng con chưa được sắp xếp.
  4. 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
  5. 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ả:

bai13 02 png

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ả:

bai13 03 png

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é !!!

Cùng chuyên mục:

Danh sách liên kết (Linked List) là gì? Các loại danh sách liên kết

Danh sách liên kết (Linked List) là gì? Các loại danh sách liên kết

Sử dụng đệ quy để giải bài toán tháp Hà Nội

Sử dụng đệ quy để giải bài toán tháp Hà Nội

Đệ quy tương hỗ (Mutual Recursion) trong C / C++

Đệ quy tương hỗ (Mutual Recursion) trong C / C++

Đệ quy lồng (Nested Recursion) trong C / C++

Đệ quy lồng (Nested Recursion) trong C / C++

Đệ quy đa tuyến (Exponential Recursion) trong C / C++

Đệ quy đa tuyến (Exponential Recursion) trong C / C++

Đệ quy nhị phân (Binary Recursion) trong C / C++

Đệ quy nhị phân (Binary Recursion) trong C / C++

Đệ quy đuôi (Tail Recursion) trong C / C++

Đệ quy đuôi (Tail Recursion) trong C / C++

Đệ quy tuyến tính (Linear Recursion) trong C / C++

Đệ quy tuyến tính (Linear Recursion) trong C / C++

Hàm đệ quy là gì? Các loại hàm đệ quy trong C / C++

Hàm đệ quy là gì? Các loại hàm đệ quy trong C / C++

Thuật toán sắp xếp Quick Sort trong C / C++

Thuật toán sắp xếp Quick Sort trong C / C++

Thuật toán sắp xếp trộn (Merge Sort) trong C / C++

Thuật toán sắp xếp trộn (Merge Sort) trong C / C++

Thuật toán sắp xếp chèn (Insertion Sort) trong C / C++

Thuật toán sắp xếp chèn (Insertion Sort) trong C / C++

Thuật toán sắp xếp nổi bọt (Bubble Sort) trong C / C++

Thuật toán sắp xếp nổi bọt (Bubble Sort) trong C / C++

Thuật toán tìm kiếm nội suy (Interpolation Search) trong C / C++

Thuật toán tìm kiếm nội suy (Interpolation Search) trong C / C++

Thuật toán tìm kiếm nhị phần (Binary Search) trong C / C++

Thuật toán tìm kiếm nhị phần (Binary Search) trong C / C++

Thuật toán tìm kiếm tuyến tính (Linear Search) trong C / C++

Thuật toán tìm kiếm tuyến tính (Linear Search) trong C / C++

Thuật toán kiểm tra năm nhuận trong C / C++

Thuật toán kiểm tra năm nhuận trong C / C++

Thuật toán kiểm tra số chẵn lẻ trong C / C++

Thuật toán kiểm tra số chẵn lẻ trong C / C++

Thuật toán tính lũy thừa trong C / C++

Thuật toán tính lũy thừa trong C / C++

Thuật toán tìm ước chung lớn nhất trong C / C++

Thuật toán tìm ước chung lớn nhất trong C / C++

Top