归并排序算法
来源:互联网 发布:企业网络宣传语 编辑:程序博客网 时间:2024/06/16 18:16
数据结构课程中的归并排序算法介绍。
归并排序算法:
思想:首先,将a[o,1,2...n-1]看成是n个长度为1的有序表,将相邻的有序表成对归并,得到n/2个长度为2的有序表;然后,再将这些有序表成对归并,得到n/4个长度为4的有序表,如此反复进行下去,最后得到一个长度为n的有序表,这样排序结束。
算法:在实现归并排序时,通常是先实现一个将两个有序表归并为一个有序表的算法Merge(),然后对各趟进行归并,最终直到归并结束。
<span style="font-size:14px;">//二路归并void Merge(int a[],int low,int mid,int high){ int i=low,j=mid+1,k=0; int b[high-low+1]; while(i<=mid&&j<=high) { if(a[i]<a[j]) { b[k]=a[i]; i++;k++; } else { b[k]=a[j]; j++;k++; } } while(i<=mid) { b[k]=a[i]; i++;k++; } while(j<=high) { b[k]=a[j]; j++;k++; } for(k=0,i=low;k<high-low+1;k++,i++) a[i]=b[k];}//单趟处理void MergePass(int a[],int length,int n){ int i; for(i=0;i+2*length-1<n;i=i+2*length) //归并长度为length的偶数对 Merge(a,i,i+length-1,i+2*length-1); if(i+length-1<n) //处理最后一个偶数对不为2*length时 Merge(a,i,i+length-1,n-1); //奇数个length单位,最后一个轮空}//归并排序void MergeSort(int a[],int n){ int length; for(length=1;length<n;length=2*length) MergePass(a,length,n);}</span>
总结:归并算法产生的有序区不一定是全局有序的,相关性能如下:
最后关于算法的测试:
/*归并排序算法*/#include <iostream>using namespace std;//二路归并void Merge(int a[],int low,int mid,int high){ int i=low,j=mid+1,k=0; int b[high-low+1]; while(i<=mid&&j<=high) { if(a[i]<a[j]) { b[k]=a[i]; i++;k++; } else { b[k]=a[j]; j++;k++; } } while(i<=mid) { b[k]=a[i]; i++;k++; } while(j<=high) { b[k]=a[j]; j++;k++; } for(k=0,i=low;k<high-low+1;k++,i++) a[i]=b[k];}//单趟处理void MergePass(int a[],int length,int n){ int i; for(i=0;i+2*length-1<n;i=i+2*length) //归并长度为length的偶数对 Merge(a,i,i+length-1,i+2*length-1); if(i+length-1<n) //处理最后一个偶数对不为2*length时 Merge(a,i,i+length-1,n-1); //奇数个length单位,最后一个轮空}//归并排序void MergeSort(int a[],int n){ int length; for(length=1;length<n;length=2*length) MergePass(a,length,n);}//测试函数int main(){ int a[10]={144,232,111,678,329,834,123,230,567,431}; cout<<"排序之前的数组元素为:"; for(int i=0;i<10;i++) cout<<a[i]<<" "; cout<<endl; MergeSort(a,10); cout<<"排序之后的数组元素为:"; for(int i=0;i<10;i++) cout<<a[i]<<" "; cout<<endl;}测试结果:
0 0
- 排序算法-归并排序
- 排序算法------归并排序
- 排序算法-归并排序
- 排序算法---归并排序
- 排序算法--归并排序
- 排序算法--归并排序
- 排序算法-归并排序
- 排序算法--归并排序
- 排序算法--归并排序
- 排序算法:归并排序
- 排序算法-归并排序
- 排序算法:归并排序
- 【排序算法】归并排序
- 排序算法--归并排序
- 排序算法-归并排序
- 排序算法--归并排序
- 排序算法:归并排序
- 【排序算法】归并排序
- UVa 1481 Genome Evolution 解题报告(枚举)
- 如何组织你的javascript代码
- libUV写TCPServer
- hdu1285 确定比赛名次(拓扑排序多种方法)
- Swift_10_网络请求
- 归并排序算法
- 编写systemd下服务脚本
- Linux下的输入/输出重定向
- HDU 3642 Get The Treasury
- hdu3314(Trouble with Election!)— 并查集
- pomelo+mongo搭建笔记
- Android自动化测试(Jenkins+Robotium+Ant+Junit)[PART one]
- IOS使用CFURLCreateStringByAddingPercentEscapes进行URL编码
- HDU - 1874 - 畅通工程续(最短路,Floyd,图论基础题)