归并排序
来源:互联网 发布:王者荣耀优化安卓7.0 编辑:程序博客网 时间:2024/06/08 06:55
归并排序的基本思路就是将数组分成二组A,B,如果这二组组内的数据都是有序的,那么就可以很方便的将这二组数据进行排序。如何让这二组组内数据有序了?
可以将A,B组各自再分成二组。依次类推,当分出来的小组只有一个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的二个小组就可以了.
这样通过先递归的分解数列,再合并数列就完成了归并排序。
void MergeArray(int* array,int first,intmid,int last,int*tempArray){ inti=first,j=mid+1; intm=mid,n=last; intk=0; while(i<=m&&j<=n) { if(array[i]<=array[j]) tempArray[k++]=array[i++]; else tempArray[k++]=array[j++]; } while(i<=m) tempArray[k++]=array[i++]; while(j<=n) tempArray[k++]=array[j++]; for(inti=0;i<k;i++) array[first+i]=tempArray[i];}void mergesort(int* array,int first,intlast,int* tempArray){ if(first<last) { intmid=(first+last)/2; mergesort(array,first,mid,tempArray); mergesort(array,mid+1,last,tempArray); MergeArray(array,first,mid,last,tempArray); }}void MergeSort(int* array,int n){ if(array==NULL||n<1) return; int*tempArray=new int[n]; mergesort(array,0,n-1,tempArray); delete[]tempArray;}
假设数列长度为N,将数列分成小数列一共需要logN,每步都是一个合并有序数列,时间复杂度为O(N),故时间复杂度O(NlogN).
归并排序的效率很高,在数组不是特别巨大的时候(10万个元素以内的排序),归并排序甚至比快速排序的效率还要高。但是归并排序需要用到一个辅助数组,空间复杂度也是O(n),当数据量巨大时,百万甚至千万,上亿的数组时,性能就比如快排和堆排序了。
0 0
- 归并排序-归并排序
- 归并和归并排序
- 归并与归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 排序::归并
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- ImageLoader must be init with configuration before using 错误解决方法
- 控制台文字矩阵、菱形排列(充分展示用逻辑替代内循环的处理技巧)
- 面试题-交通灯
- Mahout推荐算法API详解
- android 布局 控件 焦点冲突问题
- 归并排序
- 面试题-银行调度系统
- 开博了
- 如何将Java项目打包成批处理文件
- robotium整理(ID查找、相同ID区分、listview下拉刷新等)
- Makefile为源文件提供宏定义
- M3U8文件初步分析
- 【jquery】jQuery对象之间的继承关系(热荐)
- PHP学习笔记整理