合并排序(递归)
来源:互联网 发布:淘宝搜索引擎工作流程 编辑:程序博客网 时间:2024/05/18 01:52
合并排序,也称为归并排序算法(Merge Sort)。采用分而治之的方法,将一组数据拆分成左右部分,迭代拆分直到每个部分只有 一个元素。然后将左右部分迭代合并成一个序列。是速度仅次于快速排序的常用排序方法,是一种稳定的排序方法(即相同元素的顺序是不会改变的)。时间复杂度O(nlogn)。
拆分部分可以用递归函数实现。重点在于合并两个子序列为一个序列(假设是升幂排列):
(1)为两个子序列申请内存空间;
(2) 从左右序列的第一个元素开始比较,如果aux[left]<=aux[right],则将aux[left]放进合并序列arr[k],且下标k++;相反则将aux[right]放进arr[k++];
(3)如果左右序列有一个已经遍历完了,就把另一个序列的剩下的元素全部放进合并序列arr就行了。
《《注意:合并序列arr与辅助序列aux直接的元素对应关系。》》
void Merge(int arr[], int start, int mid, int end){ int aux[end+1], left, right; if(arr==NULL || start>=end) return; //copy elments from arr to aux, arr is the result arr for(int i=start; i<=end; i++) aux[i]=arr[i]; left=start; right=mid+1; //merge the left group, right group of aux into arr for(int k=start; k<=end; k++) {//get an element one time //one side ends, put the rest of other side to arr if(left>mid) //left ends, put the rest of right to arr arr[k]=aux[right++]; else if(right>end)//right ends, put the rest of left to arr arr[k]=aux[left++]; if(left<=mid && right<=end)//both sides not end if(aux[left]<= aux[right]) arr[k] = aux[left++]; else arr[k]=aux[right++]; } }void MergeSort(int arr[], int start, int end){ if(arr==NULL || start>=end) return; //Divide into two parts int mid=start+(end-start)/2; MergeSort(arr,start, mid); MergeSort(arr,mid+1,end); //Merge two parts into one Merge(arr,start,mid,end);}
0 0
- 合并排序(递归)
- 合并排序(分治递归)
- 合并排序(归并排序)的递归和非递归
- 合并排序(递归法)5
- 合并排序(递归分治 + 泛型)
- 递归的合并排序
- 递归合并排序
- 递归合并排序
- 非递归合并排序
- 递归合并排序
- 非递归合并排序
- 递归实现合并排序
- 递归之合并排序
- 合并排序-递归分治
- 合并排序-非递归
- 非递归归并排序(二路合并排序),非递归合并排序
- 排序(2)归并排序(递归、合并排序)
- 递归与分治策略-2.7合并排序(归并排序)
- 为什么浏览器采用多进程模型
- JavaScript基础教程
- 原码反码补码
- cocos2d-x 3.0 示例代码分析3:BaseTest
- ios 字节限制
- 合并排序(递归)
- Scala 深入浅出实战经典 第6讲:Map、Tuple、Zip实战解析
- Scala 深入浅出实战经典 第7讲:Scala类的属性和对象私有字段实战详解
- Scala 深入浅出实战经典\第8讲:Scala主构造器、私有构造器、构造器重载实战详解
- Scala 深入浅出实战经典 第9讲:Scala的内部类实战详解
- POJ 1061 青蛙绕地球约会-数论-(解一元一次同余方程+扩展欧几里得算法)
- [C++]学习札记2015-08-14
- hdu1276(士兵队列训练问题) java集合水过
- multisim13安装破解