#include <iostream>
using namespace std;
void MergePass(int r[], int r1[], int n, int h); //***********************//
void MergeSort1(int r[], int r1[], int n); //二路归并排序非递归算法 //
void Merge(int r[], int r1[], int s, int m, int t); //***********************//
void MergeSort2(int r[], int r1[], int s, int t); //二路归并排序递归算法
void Print(const int r[])
{
for(int i = 1; i < 8; i++)
cout << r[i] << ' ';
}
int main()
{
int r[8] = {0,60,20,10,50,15,30,55}; //r[0]空出来不用,从下标1开始
int r1[8];
cout << "初始键值序列:" << endl;
Print(r);
cout << endl << endl;
cout << "二路归并排序的非递归实现:" << endl;
MergeSort1(r, r1, 7);
Print(r);
cout << endl << endl;
cout << "二路归并排序的递归实现:" <<endl;
MergeSort2(r, r1, 1, 7);
Print(r);
cout << endl;
return 0;
}
void Merge(int r[], int r1[], int s,int m,int t)
{
int i = s, j = m + 1, k = s;
while(i <= m && j <= t)
{
if(r[i] <= r[j]) r1[k++] = r[i++];
else r1[k++] = r[j++];
}
if(i <= m) while(i <= m)
r1[k++] = r[i++];
else while(j <= t)
r1[k++] = r[j++];
}
void MergePass(int r[], int r1[], int n, int h)
{
int i = 1;
while(i <= n-2*h+1)
{
Merge(r, r1, i, i+h-1, i+2*h-1);
i += 2 * h;
}
if(i < n-h+1) Merge(r, r1, i, i+h-1, n);
else for(int k = i; k <= n;k++)
r1[k] = r[k];
}
void MergeSort1(int r[], int r1[], int n)
{
int h = 1;
while(h < n)
{
MergePass(r, r1, n ,h);
h = 2*h;
MergePass(r1, r, n, h);
h = 2*h;
}
}
void MergeSort2(int r[], int r1[], int s, int t)
{
int m;
if(s == t) r1[s] = r[s];
else {
m = (s + t) / 2;
MergeSort2(r, r1, s, m);
MergeSort2(r, r1, m+1, t);
Merge(r1, r, s, m, t);
}
}
归并排序
最新推荐文章于 2024-12-15 17:47:59 发布