- Published on
Các thuật toán sắp xếp phổ biến với C/C++
- Authors
- Name
- Trịnh Cao Cường
Mục lục
Lưu ý, các thuật toán ví dụ với việc sắp xếp mảng tăng dần
Selection Sort (Sắp xếp chọn)
Thuật toán Selection Sort sắp xếp một mảng n phần tử (phần tử thứ 0 đến thứ n-1) bằng cách:
- Xét phần tử
i(bắt đầu i = 0) - Tìm kiếm phần tử nhỏ nhất trong mảng từ
iđếnn-1 - Đổi chỗ phần tử nhỏ nhất với phần tử
i - Tăng
i++ - Bắt đầu lại bước 2 với phần tử
i+1và mảng từi+1đếnn-1 - Dừng lại khi
i==n-1.
Ví dụ Sắp xếp mảng arr[] = {4, 1, 2, 3, 5}
- Lần 1 để xét từ vị trí
arr[0]đếnarr[4]thấy1là bé nhất => đổi chỗarr[0]=4vớiarr[1]=1
Ta đượcarr[] = {1, 4, 2, 3, 5} - Lần 2 để xét từ vị trí
arr[1]đếnarr[4]thấy2là bé nhất => đổi chỗarr[1]=4vớiarr[2]=2
Ta đượcarr[] = {1, 2, 4, 3, 5} - Lần 3 để xét từ vị trí
arr[2]đếnarr[4]thấy3là bé nhất => đổi chỗarr[2]=4vớiarr[3]=3
Ta đượcarr[] = {1, 2, 3, 4, 5} - Lần 4 để xét từ vị trí
arr[3]đếnarr[4]thấy4là bé nhất => không cần đổi chỗ
Ta đượcarr[] = {1, 2, 3, 4, 5} - Đến đây chỉ còn mỗi 1 phần tử cuối cùng là
arr[4]chắc chắn là lớn nhất => không cần xét nữa
Ta được mảng đã sắp xếp làarr[] = {1, 2, 3, 4, 5}
// C program for implementation of selection sort
#include <stdio.h>
//Hàm đổi chỗ 2 biến xp, yp cho nhau
void swap(int *xp, int *yp)
{
int temp = *xp;
*xp = *yp;
*yp = temp;
}
void selectionSort(int arr[], int n)
{
int i, j, min_idx;
// Xét các phần tử i từ 0 đến n-1
for (i = 0; i < n-1; i++)
{
// Tìm kiếm phần tử nhỏ nhất trong mảng từ i đến n
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ử i
swap(&arr[min_idx], &arr[i]);
}
}
int main()
{
int n;
printf("Array length = ")
scanf("%d",&n);
int arr[n];
printf("Array input:\n")
for(int i=0;i<n;i++){
scanf("%d",&arr[i]);
}
selectionSort(arr, n);
printf("Sorted array: \n");
for (i = 0; i < size; i++)
printf("%d ", arr[i]);
printf("\n");
return 0;
}
Bubble Sort (Sắp xếp nổi bọt)
Thuật toán Selection Sort sắp xếp một mảng n phần tử (từ phần tử thứ 0 đến thứ n-1) bằng cách lặp n lần, trong lần lặp thứ i:
- Kiểm tra các phần tử từ
0đếnn-i(ví dụ lần 1 là từ0đếnn-1) - So sánh 2 phần tử liền kể
jvàj+1 - Đổi chỗ nếu
j>j+1
Suy ra:
- Với lần lặp đầu tiên ta sẽ thu được phần tử lớn nhất ở cuối dãy (vị trí
n-1) - Với lần lặp thứ 2 ta sẽ thu được phần tử lớn nhất còn lại ở vị trí
n-2 - Tiếp tục như vậy ta sẽ thu được dãy sắp xếp

=> Số lớn nhất sẽ nổi lên đầu tiên, lớn thứ 2 nổi lên tiếp theo và cứ như vậy đến cuối như bong bóng nổi lên mặt nước nên người ta gọi cách sắp xếp này là sắp xếp nổi bọt (Bubble Sort)
// C program for implementation of Bubble sort
#include <stdio.h>
//Hàm đổi chỗ 2 biến xp, yp cho nhau
void swap(int* xp, int* yp)
{
int temp = *xp;
*xp = *yp;
*yp = temp;
}
// Bubble sort
void bubbleSort(int arr[], int n)
{
int i, j;
for (i = 0; i < n - 1; i++)
// n - i - 1 nơi số lớn nhất trong đoạn [0, n-i-1] nổi lên
for (j = 0; j < n - i - 1; j++)
//Đổi chỗ nếu arr[j] > arr[j+1]
if (arr[j] > arr[j + 1])
swap(&arr[j], &arr[j + 1]);
}
// Driver program to test above functions
int main()
{
int n;
printf("Array length = ")
scanf("%d",&n);
int arr[n];
printf("Array input:\n")
for(int i=0;i<n;i++){
scanf("%d",&arr[i]);
}
bubbleSort(arr, n);
printf("Sorted array: \n");
for (i = 0; i < size; i++)
printf("%d ", arr[i]);
printf("\n");
return 0;
}
Insert Sort (Sắp xếp chèn)
Thuật toán Selection Sort giống như việc chúng ta xếp bài trong khi chơi bài vậy, chúng ta sẽ rút lần lượt từng lá để xếp vào vị trí phù hợp:
- Đầu tiên là chúng ta sẽ duyệt qua từng phần tử
- Đặt
keylà giá trị của phần tử đang xét (giả sử phần tửj) - Lần lượt so sánh giá trị của
keyvới các phần tử đứng trướcj - Nếu
keynhỏ hơn phần tửarr[i]thì nhích phần tử so sánh lên 1 ô (nhícharr[i]lên thànharr[i+1]) để lấy chỗ tí nữa đặtkeyvào. - Nếu
keylớn hơn phần tửarr[i]thì đặtkeyvàoarr[i+1] - Duyệt hết
nphần tử của mảng là xong.

// C program for insertion sort
#include <math.h>
#include <stdio.h>
/* Insert sort*/
void insertionSort(int arr[], int n)
{
int i, key, j;
for (i = 1; i < n; i++) {
key = arr[i];
j = i - 1;
/* Nhích những phần tử arr[0..i-1] lớn hơn key lên 1 vị trí */
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j = j - 1;
}
arr[j + 1] = key;
}
}
/* Driver program to test insertion sort */
int main()
{
int n;
printf("Array length = ")
scanf("%d",&n);
int arr[n];
printf("Array input:\n")
for(int i=0;i<n;i++){
scanf("%d",&arr[i]);
}
insertionSort(arr, n);
printf("Sorted array: \n");
for (i = 0; i < size; i++)
printf("%d ", arr[i]);
printf("\n");
return 0;
}
Merge Sort
Uploading...
Quick Sort
Uploading...
Các thuật toán khác
Heap Sort
Radix Sort
Counting Sort
Bucket Sort
Shell Sort
Comb Sort
Pigeonhole Sort
Cycle Sort
Tham khảo tại greeksforgreeks.org