算法导论 · 分治法 · 归并排序

  • 算法说明
    归并排序粗暴的将待排数据分成两块,分别排序,对每一部分在分成两部分,直到分成一个数再直接返回,最后逐级合并。
  • 源代码
#include <cstdio>

void Merge(int p1[],int q1, int p2[], int q2, int a[]) { //合并 
	int i = 0, j = 0, k = 0;
	while(i < q1 && j < q2) {
		if(p1[i] < p2[j]) {
			a[k++] = p1[i];
			i++;
		} else {
			a[k++] = p2[j];
			j++;
		}
	}
	if(i == q1) {
		for(i = j; i < q2; i++) {
			a[k++] = p2[i];
		}
	} else {
		for(j = i; j < q1; j++) {
			a[k++] = p1[j];
		}
	}
	
}

void MergeSort(int a[], int n) { //归并排序 
	if(n == 1) return;
	int mid = n / 2;
	int *p1 = new int[mid + 1], *p2 = new int[mid + 1];
	for(int i = 0; i < mid; i++) p1[i] = a[i];
	for(int i = 0; i < n - mid; i++) p2[i] = a[i + mid];
//	for(int i = 0; i < mid; i++) {
//		printf("%d ", p1[i]);
//	}
//	printf("\n");
//	for(int i = 0; i < n - mid; i++) {
//		printf("%d ", p2[i]);
//	}
	MergeSort(p1, mid);
	MergeSort(p2, n - mid);
	Merge(p1, mid, p2, n - mid, a);
}

int main() {
	int a[10] = {1, 4, 5, 7, 8, 9, 0, 3, 2, 6}, n = 10; //待排数组
	MergeSort(a, n);
	for(int i = 0; i < n; i++) {
		printf("%d ", a[i]);
	}
	return 0; 
}
  • 运行结果
    在这里插入图片描述
发布了77 篇原创文章 · 获赞 40 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/y_dd6011/article/details/97426238