归并排序(有代码)的时间复杂度O(nlogn)是怎么算出来的呢?(即关于时间复杂度的分析)
时间:2010-08-31
来源:互联网
本帖最后由 glq2000 于 2010-08-31 20:42 编辑
归并排序在平均情况和最坏情况下的时间复杂度都是O(nlogn),但这个是怎么算出来的呢? 希望懂的的同学 说下拉 十分感谢!!!!
下面是我写的归并排序的代码,用递归实现的,主要函数是MergeSort(), 代码如下(若感觉下列代码格式不够良好,请到这里查看:
http://fayaa.com/code/view/13301/
):
复制代码
格式良好的代码也可以参见这里。
我明白堆排序的复杂度是O(nlogn),因为对于数组a[n]中的每一个元素都要到那个二叉完全树中去“筛选”一遍,所以 是 n*logn的复杂度,但归并排序的这个O(nlogn)该如何理解呢?
多谢!!!
归并排序在平均情况和最坏情况下的时间复杂度都是O(nlogn),但这个是怎么算出来的呢? 希望懂的的同学 说下拉 十分感谢!!!!
下面是我写的归并排序的代码,用递归实现的,主要函数是MergeSort(), 代码如下(若感觉下列代码格式不够良好,请到这里查看:
http://fayaa.com/code/view/13301/
):
- /*
- * =====================================================================================
- *
- * Filename: MergeSort.cpp
- *
- * Description: MergeSort,归并排序,用递归实现
- *
- * Version: 1.0
- * Created: 2010年08月31日 14时47分14秒
- * Revision: none
- * Compiler: gcc
- *
- * Author: glq2000 (), [email protected]
- * Company: HUE ISRC
- *
- * =====================================================================================
- */
- #include <iostream>
- using namespace std;
- #define N 11
- int array[N] = { 4, 67, 456, 23, 1, 78, 26, 222, 34, 432, 12 }; //待排序数组
- int other[N]; //辅助空间,用以暂存已经排序的数组元素
-
- void Swap(int &a, int &b)
- {
- int tmp = a;
- a = b;
- b = tmp;
- }
-
-
- /* array 待排序数组
- * begin 数组开始的下标
- * end 数组最后一个元素的下标
- */
- void MergeSort(int *array, int begin, int end)
- {
- if(end-begin+1 > 2) //当数组元素个数大于2时,需要继续向下划分(递归)
- {
- MergeSort(array, begin, (end+begin)/2);
- MergeSort(array, (end+begin)/2+1, end);
-
- //合并已排序好的两部分(begin,(end+begin)/2) 和 ((end+bigin)/2+1,end)
- int i = begin, j = (end+begin)/2+1, k=begin;
- while(i<=(begin+end)/2 && j<=end)
- {//比较两个下标i和j所代表的元素,选择相对小的元素放入到辅助空间other数组中,并移动下标到下一位置
- if(array[i] < array[j])
- other[k++] = array[i++];
- else
- other[k++] = array[j++];
- }
- while(i <= (begin+end)/2) //将剩余元素拷贝至other数组
- other[k++] = array[i++];
- while(j <= end) //将剩余元素拷贝至other数组
- other[k++] = array[j++];
- for(k=begin; k<=end; ++k) //将排序好的序列拷贝回数组array中
- array[k] = other[k];
- }
- else //当数组元素个数为2或1时,直接排序
- if(array[end] < array[begin]) Swap(array[end], array[begin]);
- }
-
-
- void Output(int *array, int n)
- {
- for(int i=0; i<n; ++i)
- cout<<array[i]<<" ";
- cout<<endl;
- }
-
-
- int main()
- {
- MergeSort(array, 0, N-1);
- Output(array, N);
- return 0;
- }
我明白堆排序的复杂度是O(nlogn),因为对于数组a[n]中的每一个元素都要到那个二叉完全树中去“筛选”一遍,所以 是 n*logn的复杂度,但归并排序的这个O(nlogn)该如何理解呢?
多谢!!!
作者: glq2000 发布时间: 2010-08-31
算法同你发的另一个帖子:
http://bbs.chinaunix.net/viewthread.php?tid=1773464
http://bbs.chinaunix.net/viewthread.php?tid=1773464

作者: daybreakcx 发布时间: 2010-08-31
两者的公式都是一样的,归并是线性的,也就是那个n,然后分治时候是T(n/2),所以公式是一样的
T(n)=2T(n/2)+n
T(n)=2T(n/2)+n
作者: daybreakcx 发布时间: 2010-08-31
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28