您的位置:首页 > 其它

2.3.1-分治法-归并排序

2017-08-11 20:03 134 查看





#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <string>
#include <string.h>
#include <cmath>
#include <sstream>
#include <set>
#include <map>
#include <functional>
#include <queue>
#include <vector>
using namespace std;

const int maxn = 1e9;
int A[20] = { 0,0,0,0,0,0,0,0,0,5,2,4,7,1,3,2,6};
int L[20], R[20];

void MergeSort(int p,int q,int r)
{
int i, j, k;
int n1 = q - p+1;
int n2 = r - q;

for (i = 1; i <= n1; i++)
L[i] = A[p + i - 1];
for (i = 1; i <= n2; i++)
R[i] = A[q + i];
L[n1 + 1] = maxn;
R[n2 + 1] = maxn;

i = j = 1;
for (k = p; k <= r; k++)
{
if (L[i] <= R[j])
{
A[k] = L[i];
i++;
}
else
{
A[k] = R[j];
j++;
}
}
}

void Merge(int p, int r)
{
if (p < r)
{
int q = (p + r) / 2;
Merge(p, q);        //排序左半部分
Merge(q+1, r);      //排序右半部分
MergeSort(p, q, r);
}
}
int main()
{
Merge(9,16);
for (int i = 9; i <= 16; i++)
cout << A[i] << " ";
system("pause");
}


练习2.3-2 另外一种不采用哨兵的MergeSort
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <string>
#include <string.h>
#include <cmath>
#include <sstream>
#include <set>
#include <map>
#include <functional>
#include <queue>
#include <vector>
using namespace std;

const int maxn = 1e9;
int A[11] = {9,8,7,6,5,4,3,2,1,0 ,-1};
int L[20], R[20];

void MergeSort(int p,int q,int r)
{
int i,j,k,n1,n2;
n1=q-p+1;
n2=r-q;
//   cout<<n1<<" "<<n2<<endl;
for(i=0;i<n1;i++)
L[i]=A[p+i];

for(i=0;i<n2;i++)
R[i]=A[q+i+1];

for(i=0,j=0,k=p;k<=r;k++)
{
if(i==n1)
A[k]=R[j++];
else if(j==n2)
A[k]=L[i++];
else if(L[i]<=R[j])
A[k]=L[i++];
else
A[k]=R[j++];
}
}

void Merge(int p,int r)
{
if(p<r)
{
//cout<<p<<" "<<" "<<r<<endl;
int mid=(p+r)/2;
Merge(p,mid);
Merge(mid+1,r);
MergeSort(p,mid,r);
}
}
int main()
{
Merge(0,9);
for(int i=0;i<10;i++)
cout<<A[i]<<" ";
cout<<endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  归并排序