03 | 桶排序和归并排序
分治算法
概念
在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题.....直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。
步骤
分治法在每-层递归上都有三个步骤:
- 分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;
- 解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题
- 合并:将各个子问题的解合并为原问题的解。
归并排序
递归过程
归并过程
代码
#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;
}