[Thuật toán] Sắp xếp trộn – Merge Sort
Thuật toán sắp xếp trộn (Merge Sort) là một trong các thuật toán sắp xếp hay được sử dụng. Gần giống với thuật toán sắp xếp nhanh (Quick Sort) về việc sắp xếp bằng việc tách mảng ban đầu thành 2 nửa, nhưng với Quick Sort thì dùng phần tử giữa làm mốc so sánh còn Merge Sort thì chia hẳn ra, sắp xếp từng mảng rồi mới “trộn” 2 mảng đã sắp xếp lại.
Dưới đây là code ngôn ngữ C của thuật toán:
#include <stdio.h> /* xuat mang a tu vi tri l (left) den vi tri r (right)*/ void xuat(int a[], int l, int r) { int i; for (i = l; i <= r; i++){ printf("%d \t", a[i]); } printf("\n"); } /* tron 2 mang * mang a[l -> m] da sap xep * mang a[m+1 -> r] da sap xep * */ void tron(int a[], int l, int m, int r){ int i, length; int l_end = m - 1; i = l; length = r - l; int temp[length]; /* tron cac phan tu cua 2 mang con cua a*/ while(l <= l_end && m <= r) { if (a[l] <= a[m]) { temp[i++] = a[l++]; } else { temp[i++] = a[m++]; } } /* Neu mang dau tien chua het */ while(l <= l_end) { temp[i++] = a[l++]; } /* Neu mang thu 2 chua het*/ while(m <= r) { temp[i++] = a[m++]; } for (i = 0; i <= length; i++, r--) { a[r] = temp[r]; } } /* thuat toan sap xep tron*/ void sx_tron(int a[], int l, int r) { //xuat(a, l, r); int m; if(l < r) { m = (l + r) / 2; sx_tron(a, l, m); sx_tron(a, m + 1, r); tron(a, l, m + 1, r); } } int main(){ int n = 5; int a[] = {2, 6, 3, 8, 5}; sx_tron(a, 0, n-1); xuat(a, 0, n - 1); return 0; }
Chào bạn,
Mình không hiểu rõ lắm về đoạn:
int temp[length];
và những chỗ có liên quan đến temp. Bạn có thể giải thích rõ hơn mục đích và ý nghĩa của nó được không?
Cảm ơn bạn rất nhiều!
int temp[length];
Là tạo một mảng nguyên có tên là temp với độ dài length đó bạn. Còn các temp ở dưới, ví dụ như temp[i++] có nghĩa là lấy giá trị tại vị trí thứ i++ của mảng temp.
Cảm ơn bạn. Bạn ấy nói đúng đó Thien
giải thuật bị lỗi khi mà n >= 12.
Cảm ơn bạn, mình sẽ kiểm tra lại.