归并排序——非递归的方法
// test20.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
#include<vector>
#include<string>
#include<queue>
#include<stack>
#include<cstring>
#include<string.h>
#include<deque>
#include <forward_list>
using namespace std;
class Solution {
public:
//归并排序
//合并,将数组R里面的前半部分和后半部分合并,小的放在前面,大的放在后面
void Merge(vector<int> R, vector<int>& T, int low, int high)
{
int mid = (high+low-1) / 2;
//high即指最大元素的指针,mid=high/2
int i = low;// i前半部分的坐标
int j = mid+1 ;// j后半部分的坐标
while (i <= mid&&j < high)//前半部分的元素和后半部分都没有完
{
if (R[i] < R[j])
{
T.push_back(R[i]);
++i;
}
else
{
T.push_back(R[j]);
++j;
}
}
//如果R的前半部分不为空
while (i<=mid)
{
T.push_back(R[i]);
++i;
}
while (j<high)
{
T.push_back(R[j]);
++j;
}
}
//归并排序
//需要一个辅助数组S,用来存储已经分裂的点
void MSort(vector<int> R, vector<int> &T)
{
for (int i = 2;i <= R.size();i = i * 2)//i表示归并的次数
{
if (i > 2)
{
R.clear();
R = T;
T.clear();
}
cout << "执行的次数!" << endl;
int j = i;
for (j = i;j <= R.size();j += i)//j表示在进行第i次归并时的操作
{
Merge(R, T, j - i, j);
cout << "i,j:" << j-i << "," << j << endl;
}
Merge(R, T, j - i, R.size());
cout << "i,j:" << j - i << "," << R.size() << endl;
}
R.clear();
R = T;
T.clear();
Merge(R,T,0,R.size());
}
//打印
void print(vector<int> vec)
{
for (auto it = vec.begin();it != vec.end();++it)
{
cout << *it << " ";
}
cout << endl;
}
};
int main()
{
vector<int> vec = { 49,38,65,97,76,13,27};
vector<int> vec1 = { 49,38};
vector<int> vec3;
Solution so;
// so.Merge(vec, vec3, 0, 7);
so.MSort(vec, vec3);
so.print(vec3);
return 0;
}