mmxingye

导航

03 | 桶排序和归并排序

分治算法


概念

在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题.....直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。

步骤

分治法在每-层递归上都有三个步骤:

  1. 分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;
  2. 解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题
  3. 合并:将各个子问题的解合并为原问题的解。

归并排序


递归过程

归并过程

代码


#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;
const int N = 1e4 + 10;
int is1[N], is2[N];
void merge(int low, int mid, int high) {
	/*具体归并的过程*/
	int i = low, j = mid + 1, k = low;
	while (i <= mid && j <= high) {
		if (is1[i] < is1[j])
			is2[k++] = is1[i++];
		else
			is2[k++] = is1[j++];
	}
	/*假如第一个序列有剩余*/
	while (i <= mid)
		is2[k++] = is1[i++];
	while (j <= high)
		is2[k++] = is1[j++];
	/*拷贝回原数组*/
	for (int i = low; i <= high; i++)
		is1[i] = is2[i];
}
void mergesort(int a, int b) {
	/*递归出口*/
	if (a >= b)
		return;
	/*分治*/
	int mid = (a + b) / 2;
	mergesort(a, mid);
	mergesort(mid+1, b);
	/*合并*/
	merge(a, mid, b);
}
int main() {
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++)
		cin >> is1[i];
	//归并排序
	mergesort(1, n);
	for (int i = 1; i <= n; i++)
		cout << is1[i] << " ";
	system("pause");
	return 0;
}

桶排序


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
	int a[11], i, j, t;
	memset(a, 0, sizeof(a));			//将每一个桶初始化为0
	for (i = 1; i <= 5; i++) {			//读入5个数字,每个数字满足小于桶的个数
		scanf("%d", &t);
		a[t]++;
	}
	for (i = 0; i < 11; i++) {
		for (j = 1; j <= a[i]; j++)
			printf("%d ", i);		//出现了几次就打印几次
	}
	system("pause");
	return 0;
}

posted on 2022-04-12 20:49  独立树  阅读(65)  评论(0编辑  收藏  举报