[算法] 归并排序 – 合并排序

合并排序算法 (合并排序) 一个排序算法或使用. 几乎相同的 快速排序算法 (快速排序) 通过把原数组的安排 2 一半, 但与快速排序元素作为之间的合并排序具有里程碑意义的比较,仍然明显地分为, 然后排序每个阵列 “混合” 2 重排阵.

这里是该算法的C语言代码:

#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;
}