二路归并排序

来源:互联网 发布:网络电影《罪》在哪看 编辑:程序博客网 时间:2024/05/22 08:10

二路归并排序是归并排序的一种基本方式。归并排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个有序的子序列,再把有序的子序列合并为整体有序序列。

以序列11,24,17,7,22,36,27,10,19,18 为例

初始时为:11  24  17  7  22  36  27  10 

第一次归并(两两合并):{11,24}、   {7,17}、  {22,36}、{10,27}

第二次归并:{7,11,17,24}、{10,22,27,36}

第三次归并:{7,10,17,22,24,27,36}

下面代码是用C++写的例子:

#include<iostream>using namespace std;#define MaxSize 100void Merge(int source[],int target[],int start,int mid,int end){ int j,k,n; for(j=mid+1,k=start;start<=mid && j<=end;k++)  {  if (source[start]<source[j])   target[k]=source[start++];  else   target[k]=source[j++]; } if(start<=mid) {  for(n=0;n<=mid-start;n++)   target[k+n]=source[start+n];  } if(j<=end) {  for(n=0;n<=end-j;n++)   target[k+n]=source[j+n];   }}void MergeSort(int source[],int target[],int start, int end){ int mid; int tmp[MaxSize]; if(start==end)  target[start]=source[start]; else {  mid=(start+end)/2;     MergeSort(source,tmp,start,mid);   MergeSort(source,tmp,mid+1,end);   Merge(tmp,target,start,mid,end);  }}void main(){int a[10]={11,24,17,7,22,36,27,10,19,18};int b[10]={0};MergeSort(a,b,0,9);for(int i=0;i<10;i++){cout<<b[i]<<endl;}}

0 0
原创粉丝点击