归并排序(merge sort)
2014-09-11 19:21
274 查看
归并排序利用分治算法
1 divide:将数组平均分两部分(mergesort函数)
2 conquer:两部分数组分别排序(mergesort函数)
3.combine:将两部分按从小到大交替写入临时数组,最后复制到原数组(merge函数)
算法的接口驱动为mergedrive函数
注意:递归过程中,函数merge某一次可能只会用到tmp的一部分,所以i=lft而不是0,同样从tmp复制回a的时候也只是复制一部分,而不是全部复制
算法的复杂度
T(n) = 2T(n/2) + O(n)
= O(nlogn)
void merge(int a[],int tmp[],int begin,int mid,int end){
int rth,lft,i,n;
rth = mid + 1;
lft = begin;
i = lft;
n = end - begin +1;
while(lft<=mid&&rth<=end){
if(a[lft]<a[rth])
tmp[i++] = a[lft++];
else tmp[i++] = a[rth++];
}
while(lft<=mid){
tmp[i++] = a[lft++];
}
while(rth<=end){
tmp[i++] = a[rth++];
}
for(i = 0;i<n;i++,end--)//将tmp的内容拷贝回去
a[end] = tmp[end];
}
void mergesort(int a[],int tmp[],int begin,int end){
int mid;
mid = (begin + end) / 2;
if(begin<end){
mergesort(a,tmp,begin,mid);
mergesort(a,tmp,mid+1,end);
merge(a,tmp,begin,mid,end);
}
}
void mergedrive(int a[],int n){
int *tmp;
int i;
tmp = (int *)malloc(sizeof(int)*n);
if(tmp!=NULL){
mergesort(a,tmp,0,n-1);
}
free(tmp);
}
1 divide:将数组平均分两部分(mergesort函数)
2 conquer:两部分数组分别排序(mergesort函数)
3.combine:将两部分按从小到大交替写入临时数组,最后复制到原数组(merge函数)
算法的接口驱动为mergedrive函数
注意:递归过程中,函数merge某一次可能只会用到tmp的一部分,所以i=lft而不是0,同样从tmp复制回a的时候也只是复制一部分,而不是全部复制
算法的复杂度
T(n) = 2T(n/2) + O(n)
= O(nlogn)
void merge(int a[],int tmp[],int begin,int mid,int end){
int rth,lft,i,n;
rth = mid + 1;
lft = begin;
i = lft;
n = end - begin +1;
while(lft<=mid&&rth<=end){
if(a[lft]<a[rth])
tmp[i++] = a[lft++];
else tmp[i++] = a[rth++];
}
while(lft<=mid){
tmp[i++] = a[lft++];
}
while(rth<=end){
tmp[i++] = a[rth++];
}
for(i = 0;i<n;i++,end--)//将tmp的内容拷贝回去
a[end] = tmp[end];
}
void mergesort(int a[],int tmp[],int begin,int end){
int mid;
mid = (begin + end) / 2;
if(begin<end){
mergesort(a,tmp,begin,mid);
mergesort(a,tmp,mid+1,end);
merge(a,tmp,begin,mid,end);
}
}
void mergedrive(int a[],int n){
int *tmp;
int i;
tmp = (int *)malloc(sizeof(int)*n);
if(tmp!=NULL){
mergesort(a,tmp,0,n-1);
}
free(tmp);
}
相关文章推荐
- MergeSort(归并排序)算法Java实现
- 归并排序(Merge-Sort)的C语言实现
- 归并排序(MergeSort)
- 归并排序(merge_sort)的C语言实现
- 归并排序(Merge Sort)
- C语言-数据结构-归并排序(merge sort)-递归 迭代-源代码及分析
- 第七章 ALDS1_5_B:Merge Sort 归并排序
- 排序算法总结之归并排序 Merge Sort
- 二路归并排序(Merge Sort)
- 数据结构和算法分析之排序篇--归并排序(Merge Sort)和常用排序算法时间复杂度比较(附赠记忆方法)
- 归并排序(MergeSort)的原理及延伸性思考
- Mergesort-归并排序
- 归并排序(mergeSort)之非递归算法
- 归并排序(mergeSort) 与 分而治之策略(divide and conquer)
- Java 归并排序(MergeSort)算法实现
- 归并排序(merge sort)的实现
- 归并排序(MergeSort)的原理及延伸性思考
- 归并排序(Merge Sort)
- MergeSort-归并排序(C++实现)
- 归并排序(Merge Sort)