归并排序实现及时间复杂度分析
来源:互联网 发布:seo与sem的异同 编辑:程序博客网 时间:2024/05/21 07:49
归并排序思想:
1.把序列分为两部分,对两部分分别排序(拆分的边界条件:元素大于1个)
2.合并已排序两部分
1.把序列分为两部分,对两部分分别排序(拆分的边界条件:元素大于1个)
2.合并已排序两部分
时间复杂度分析:
T(1) = 1;
T(n) = 2*T(n/2) + a*n;(a为常数,每次合并时,复杂度为O(n))
= 2*(2*T(n/4)+a*n/2) + a*n
= 4*T(n/4) + 2*a*n
= 4*(2*T(n/8)+a*n/4) + 2*a*n
= 8*T(n/8) + 3*a*n
=......
= 2^k*T(1) + k*a*n (其中n==2^k,即k=log2(n))
= n + a*n*log2(n);
所以时间复杂度为O(nlogn)
#include <cstdio>#include <iostream>#define N 10005using namespace std;int a[N], b[N];//b为辅助数组,故空间复杂度为O(n)void Merge(int a[], int s, int m, int e, int tmp[]){int p = 0, p1 = s, p2 = m + 1;//开始合并while (p1 <= m && p2 <= e){if (a[p1] < a[p2])tmp[p++] = a[p1++];elsetmp[p++] = a[p2++];}while (p1 <= m)tmp[p++] = a[p1++];while (p2 <= m)tmp[p++] = a[p2++];for (int i = 0; i < p; i++)//把结果拷贝到全局数组a中a[i + s] = tmp[i];}void Mergesort(int a[], int s, int e, int tmp[]){if (s < e)//分治终止条件s==e,即只剩下一个元素{int m = s + (e - s) / 2;Mergesort(a, s, m, tmp);//分为两部分Mergesort(a, m + 1, e, tmp);Merge(a, s, m, e, tmp);//治:对两部分进行合并}}int main(){int n;scanf("%d", &n);for (int i = 0; i < n; i++)scanf("%d", &a[i]);Mergesort(a, 0, n - 1, b);//a为待排数组,中间两个参数代表对下标此范围内进行排序,b为辅助数组for (int i = 0; i < n; i++)printf("%d ", a[i]);printf("\n");return 0;}
0 0
- 归并排序实现及时间复杂度分析
- 归并排序时间复杂度分析
- 插入排序和归并排序实现以及时间复杂度分析
- 归并排序及其时间复杂度分析
- 归并排序及其时间复杂度分析
- 归并排序及其时间复杂度分析
- 归并排序及其时间复杂度分析
- 归并排序及其时间复杂度分析
- 自然归并排序算法时间复杂度分析
- 归并排序的原理及时间复杂度
- 简单排序算法时间空间复杂度分析及应用(8)-归并排序
- 插入排序 和 归并排序(分治)的c实现和时间复杂度分析
- 插入排序算法的java实现及时间复杂度分析
- 堆排序算法原理,实现及时间复杂度分析
- 算法 插入排序 的 JS实现及时间复杂度分析
- 归并排序的分治算法与时间复杂度分析
- 堆排序算法及时间复杂度分析
- 快速排序及时间复杂度分析
- DeepMind组建美国团队:加强与谷歌的联系
- FZU 1036 四塔问题(规律)
- leetcode144. Binary Tree Preorder Traversal
- 基于How To Tango With Django 1.9的重新实践(0-5)
- HDU3488-Tour
- 归并排序实现及时间复杂度分析
- [BZOJ 1005][HNOI2008]明明的烦恼(prufer编码+组合数学+高精度)
- 【BZOJ1076】【SCOI2008】奖励关(期望+状压dp)
- 盾神与条状项链
- android:versionCode和android:versionName
- Thymeleaf初探
- 关于不能创业失败
- linux--VM虚拟机下配置IP地址(NAT模式)
- 【c++ primer】第10章读书笔记