归并排序
来源:互联网 发布:c语言输出钻石图案 编辑:程序博客网 时间:2024/04/28 05:24
1、算法原理
归并排序(mergesort)以O(NlogN)最坏情形运行时间运行,而使用的比较次数几乎是最优的。它是递归算法一个很好的实例。
算法的基本操作就是合并两个已排序的表。因为两个表是已排序的,所以若将输出放到第三个表中时则该算法可以通过对输入数据一趟排序来完成。
2、代码
/*++++++++++++++++++++++++++++++++++++++归并排序(C版)++author:zhouyongxyz2013-4-15 9:16+++++++++++++++++++++++++++++++++++++*/#include <cstdio>#include <cstdlib>#define N 8typedef int ElementType;void Merge(ElementType a[],ElementType tmp[],int lpos,int rpos,int rightEnd); //将已知的两个已排序的数组进行合并。void MSort(ElementType a[],ElementType tmp[],int left,int right);//递归调用实现数组的合并操作。void MergeSort(ElementType a[],int n); //归并排序int main(){int a[N]={4,3,5,2,9,7,6,8};MergeSort(a,N);for(int i=0;i<N;i++)printf("%d ",a[i]);printf("\n");return 0;}void MergeSort(ElementType a[],int n){ElementType *tmp=(ElementType*)malloc(n*sizeof(ElementType));if(tmp!=NULL)MSort(a,tmp,0,n-1);}void MSort(ElementType a[],ElementType tmp[],int left,int right){if(left<right){int center=(left+right)/2;MSort(a,tmp,left,center);MSort(a,tmp,center+1,right);Merge(a,tmp,left,center+1,right);}}void Merge(ElementType a[],ElementType tmp[],int lpos,int rpos,int rightEnd){int tpos=0;int leftEnd=rpos-1;int numElements=rightEnd-lpos+1;while(lpos<=leftEnd&&rpos<=rightEnd){if(a[lpos]<=a[rpos])tmp[tpos++]=a[lpos++];elsetmp[tpos++]=a[rpos++];}while(lpos<=leftEnd)tmp[tpos++]=a[lpos++];while(rpos<=rightEnd)tmp[tpos++]=a[rpos++];for(int i=numElements-1;i>=0;i--,rightEnd--)a[rightEnd]=tmp[i];}
- 归并排序-归并排序
- 归并和归并排序
- 归并与归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 排序::归并
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "stdafx.h
- How to use Git
- Android - API - android.Manifest.permission (权限)
- SPOJ 1128 数位DP
- JSF页面组件化
- 归并排序
- asp页面跳转返回获取页面框架也
- 36.n支队伍比赛,分别编号为0,1,2。。。。n-1,已知它们之间的实力对比关系
- 如何打开指定类型的文件
- javascript自动生成年月日下拉选择框
- 【科研论文】一种多协议融合的物联网节点设计
- 尔罗斯方块
- 快速排序
- jQuery对象与DOM对象之间的转换