归并排序——非递归的方法

// 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;
}
posted @ 2016-11-15 18:42  wdan2016  阅读(163)  评论(0编辑  收藏  举报