# data[].attributes.headline
Cảm ơn cô đã xem bài tập 1 của nhóm 8. Mong cô để lại các ý kiến, để nhóm em có thể bổ sung và hoàn thiện phần làm bài của nhóm mình 

# data[].attributes.subject
Cảm ơn cô đã xem bài tập 1 của nhóm 8. Mong cô để lại các ý kiến, để nhóm em có thể bổ sung và hoàn thiện phần làm bài của nhóm mình 

# data[].attributes.body
+ Nguyễn Việt Long: Giới thiệu về thuật toán sắp xếp trộn-Merge Sort
+ Đỗ Tấn Từ: Mô tả cách hoạt động của thuật toán
+ Trần Đăng Hào: Minh họa rõ hơn về cách duyệt mảng và sắp xếp
+ Hồ Lê Minh Hoàng: Cài đặt thuật toán và in ra màn hình kết quả

# data[].attributes.body
1.   Trần Đăng Hào
2.   Đỗ Tấn Từ
3.   Hồ Lê Minh Hoàng
4.    Nguyễn Việt Long
-->> Nhóm trưởng: Đỗ Tấn Từ

# data[].attributes.body
Bước 1:

Chia dãy cần sắp xếp thành 2 dãy con

Từ dãy con thu được lại tiếp tục chia thành 2 dãy con nhỏ hơn nữa

Quá trình phân chia tiếp tục cho đến khi thu được dãy con chỉ còn duy nhất 1 phần tử.

Bước 2:

Hòa nhập 2 dãy con nhỏ nhất thành dãy con lớn hơn sao cho đúng thứ tự

Từ hai dãy con lớn hơn lại hòa nhập thành 2 dãy con lớn hơn nữa….

Quá trình hòa nhập cứ tiếp tục như vậy cho đến khi thu được dãy ban đầu đã được sắp xếp.

# data[].attributes.body
Từ một mảng các chuỗi ban đầu , ta chia mảng thành 2 nữa bằng cách lấy (0 + n-1)/2 , tiếp theo ở mỗi nữa sẽ thực hiện so sánh và sắp xếp,

Chuỗi sẽ được chia nhỏ để sắp xếp liên tục, đến sau cùng thành 1 mảng sắp xếp

# data[].attributes.body
Code
#include <stdio.h>
#include <string.h>

struct string{
char s[25];
};

void nhapMang(string arr[], int n){
int i;
for(i = 0; i < n; i++){
printf("Nhap Chuoi Thu %d: ", i+1);
fflush(stdin);
gets(arr[i].s);
}
}

void xuatMang(string arr[], int n){
int i;
for (i = 0; i < n;i++){
printf("\t %s",arr[i].s);
}
}

void merge(string arr[], int l, int m, int r)
{
int i, j, k;
int n1 = m - l + 1;
int n2 = r - m;

string L[n1], R[n2];

for (i = 0; i < n1; i++)
strcpy(L[i].s, arr[l + i].s);
for (j = 0; j < n2; j++)
strcpy(R[j].s, arr[m + 1 + j].s);

i = 0;
j = 0;
k = l;
while (i < n1 && j < n2) {
if (strcmp(L[i].s, R[j].s) <= 0) {
arr[k] = L[i];
i++;
}
else {
arr[k] = R[j];
j++;
}
k++;
}

while (i < n1) {
arr[k] = L[i];
i++;
k++;
}

while (j < n2) {
arr[k] = R[j];
j++;
k++;
}
}

void mergeSort(string arr[], int l, int r)
{
if (l < r) {
int m = l + (r - l) / 2;
mergeSort(arr, l, m);
mergeSort(arr, m + 1, r);
merge(arr, l, m, r);
}
}

int main() {
int n;
printf("Nhap So Chuoi Ban Muon Sap Xep: ");
scanf("%d", &n);
string arr[n];
nhapMang(arr, n);
printf("\n\nCac chuoi da nhap vao la: \n");
xuatMang(arr, n);
mergeSort(arr, 0, n - 1);
printf("\n\nCac chuoi sau khi da sap xep la: \n");
xuatMang(arr, n);
}

# data[].attributes.headline
Giới thiệu thuật toán sắp xếp bằng trộn-Merge Sort (Nguyễn Việt Long: 2050531200223)

# data[].attributes.subject
Giới thiệu thuật toán sắp xếp bằng trộn-Merge Sort (Nguyễn Việt Long: 2050531200223)

# data[].attributes.body
+ Sắp xếp trộn là thuật toán có độ phức tạp ở mức trung bình và dùng phương pháp chia để trị giống thuật toán sắp xếp nhanh quick sort.
+ Merge sort chia mảng cần sắp xếp thành 2 nửa. Tiếp tục lặp lại việc này ở các nửa mảng đã chia. Sau cùng gộp các nửa đó thành mảng đã sắp xếp. Hàm merge() được sử dụng để gộp hai nửa mảng. Hàm merge(arr, l, m, r) là tiến trình quan trọng nhất sẽ gộp hai nửa mảng thành 1 mảng sắp xếp, các nửa mảng là arr[l…m] và arr[m+1…r] cuối cùng tạo thành mảng đã được sắp xếp

# data[].attributes.headline
CÙNG NHAU PHÂN TÍCH SẮP XẾP BẰNG TRỘN ĐỐI VỚI CHUỖI

# data[].attributes.subject
CÙNG NHAU PHÂN TÍCH SẮP XẾP BẰNG TRỘN ĐỐI VỚI CHUỖI