分治算法--归并排序
来源:互联网 发布:双氧水流量计优化 编辑:程序博客网 时间:2024/04/29 00:53
一.基本思想与步骤
归并排序法(Merge Sort,以下简称MS)是分治法思想运用的一个典范。直观上其操作如下:
Merge-Sort
——Divide-and-Conquer(P)
1. 如果子序列长度为1,排序完成。
—— if |P|≤n0, thenreturn(ADHOC(P))
2. 分解待排序的n个元素的序列成各具n/2个元素的子序列。
——将P分解为较小的子问题 P1 ,P2,...,Pk。
3. 递归排序两个子序列。
——for i←1 to k,do yi ←Divide-and-Conquer(Pi)△递归解决Pi。
4. 合并两个已排序的子序列以产生已排序的答案。
——T ← MERGE(y1,y2,...,yk)△合并子问题, return(T)。
当待排序的序列长度为1时,即已牌号序,递归“开始回升”,不做任何操作。
归并排序的关键在于MERGE合并已排序子序列,类如玩扑克牌,假设桌面上有已经排好序的两堆扑克牌,如何合并成单一有序输出堆。算法导论实现伪代码如下:
MERGE(A,p,mid,r)n1 = mid – p + 1, n2 = r – mid;Let L[1…n1] and R[1…n2] be new arrays;For i = 1 to n1 L[i] = A [p+i-1];For i = 1 to n2 R[i] = A [mid+i];L[n1+1] = R[n2+1] = MAX;i = 1 , j =1;For( k = p to rIf L[i] < R[j] A[k] = L[i++];Else A[k] = R[j++];现在将MERGE作为一个子程序应用。下面MERGE-SORT(A,p,r)排序A[p..r]中元素,若p>=r,则子数组最多一个元素,即已经划分完成,且已排序完成。否则,分解成A[p..mid]A[mid+1..r]两个子数组,递归调用MERGE-SORT。伪代码如下:
MERGE-SORT(A,p,r)If(p<r)Mid = (p+r)/2;MERGE-SORT(A,p,mid);MERGE-SORT(A,mid+1,r);MERGE(A,p,mid,r);
#include<stdio.h>#define MAX 0x3f3f3fvoid Merge(int a[],int l,int m,int u){int i,j=0,k=0;int *b=new int[m-l+1];int *c=new int[u-m];for(i=0;i<m-l+1;i++)b[i]=a[l+i-1];b[i]=MAX;for(i=0;i<u-m;i++)c[i]=a[m+i];c[i]=MAX;for(i=l-1;i<u;i++){if(b[j]<=c[k])a[i]=b[j++];else a[i]=c[k++];}/*puts("test");for(i=l-1;i<u;i++)printf("%d ",a[i]);puts("");*/}void Mergesort(int a[],int begin,int end){int mid=(begin+end)/2;if(begin<end){Mergesort(a,begin,mid);Mergesort(a,mid+1,end);Merge(a,begin,mid,end);}}int main(){int a[20];int i;for(i=0;i<20;i++)scanf("%d",&a[i]);Mergesort(a,1,20);for(i=0;i<20;i++)printf("%d ",a[i]);puts("");return 0;}
二.复杂度分析
时间复杂度为O(nlogn) 这是该算法中最好、最坏和平均的时间性能。空间复杂度为 O(n)。比较操作的次数介于(nlogn) / 2和nlogn - n + 1。赋值操作的次数是(2nlogn)。归并算法的空间复杂度为:0 (n)。归并排序比较占用内存,但却是一种效率高且稳定的算法。
0 0
- 分治算法--归并排序
- 分治算法-归并排序
- 分治算法-归并排序
- 算法--分治归并排序
- 归并排序-分治算法
- 分治算法---归并排序
- 分治算法实现归并排序
- 分治算法: 归并排序(详解)
- 分治算法之归并排序
- 分治算法之归并排序
- 分治算法之归并排序
- 归并排序(分治算法)
- 【算法】分治法(快速排序,归并排序)
- 分治法之归并排序算法
- 分治算法一(归并排序)
- 【算法导论】分治法及归并排序
- 分治法 归并排序(递归算法)
- js算法:分治法-归并排序
- 九度OJ 题目1018:统计同成绩学生人数
- Eclipse注解模板设置详解
- Linux学习笔记:线程互斥锁
- HDU 1285 确定比赛名次 (拓扑排序)
- Java堆、栈和常量池以及相关String的详细讲解(经典中的经典)
- 分治算法--归并排序
- SOA服务分类
- 课堂笔记09
- C语言深度解剖——读书笔记-9、指针和数组
- 全局结果的视图配置
- 一款不错的JS日期插件 Mobiscroll
- hdu1423 LCIS
- 南邮 OJ 1040 约数之和
- HDU 5312:Sequence 三角形数