- 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+1
và 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ấy1
là bé nhất => đổi chỗarr[0]=4
vớiarr[1]=1
Ta đượcarr[] = {1, 4, 2, 3, 5}
- Lần 2 để xét từ vị trí
arr[1]
đếnarr[4]
thấy2
là bé nhất => đổi chỗarr[1]=4
vớiarr[2]=2
Ta đượcarr[] = {1, 2, 4, 3, 5}
- Lần 3 để xét từ vị trí
arr[2]
đếnarr[4]
thấy3
là bé nhất => đổi chỗarr[2]=4
vớiarr[3]=3
Ta đượcarr[] = {1, 2, 3, 4, 5}
- Lần 4 để xét từ vị trí
arr[3]
đếnarr[4]
thấy4
là 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ể
j
và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
key
là 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
key
với các phần tử đứng trướcj
- Nếu
key
nhỏ 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 đặtkey
vào. - Nếu
key
lớn hơn phần tửarr[i]
thì đặtkey
vàoarr[i+1]
- Duyệt hết
n
phầ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