1. 程式人生 > >C++實現歸併排序演算法

C++實現歸併排序演算法

1.歸併排序 實現方法:

     把長度為 n 的數列,每次簡化為兩個長度為 n/2 的數列,直至數列中剩一個元素後兩兩合併,直至所有都參與操作。

    合併方法:比較兩個數列第一個元素,將最小的放在另一個數中C中,重複直至某數列為空,然後將另一個數列中元素都放入C陣列中

2.程式碼實現:

#include <iostream>
#include <vector>

using namespace std;

// 拷貝陣列函式
// 將陣列SourceData的第BeginIndex個元素~第EndIndex個元素拷貝到另一個數組中,並返回
template <class T>
vector<T> CopyVectorData(vector<T> &SourceData, int BeginIndex, int EndIndex)
{
	vector<T> tempVec;
	
	for (int i = BeginIndex; i <= EndIndex; ++i)
	{
		tempVec.push_back(SourceData[i]);
	}
	return tempVec;
}

// 合併函式
// 將兩個陣列中的元素按照從小到大的形式放到另一個數組中,並返回
template <class T>
vector<T> Merge(vector<T> &LeftData, vector<T> &RightData)
{
	size_t leftIndex = 0;
	size_t rightIndex = 0;
	vector<T> resultData;

	while( (leftIndex < LeftData.size()) && (rightIndex < RightData.size()))
	{
		if ( LeftData[leftIndex] <= RightData[rightIndex])
		{
			resultData.push_back(LeftData[leftIndex]);
			++leftIndex;
		}
		else
		{
			resultData.push_back(RightData[rightIndex]);
			++rightIndex;
		}
	}
	
	while(leftIndex < LeftData.size())
	{
		resultData.push_back(LeftData[leftIndex]);
		++leftIndex;
	}
	while(rightIndex < RightData.size())
	{
		resultData.push_back(RightData[rightIndex]);
		++rightIndex;
	}
	return resultData;
}

// 歸併排序 演算法
template <class T>
vector<T> MergeSort(vector<T> &SortData)
{
	if (SortData.size() == 1)
	{
		return SortData;
	}
	vector<T> leftData = CopyVectorData(SortData, 0, SortData.size()/2 - 1);
	vector<T> rightData = CopyVectorData(SortData, SortData.size()/2, SortData.size()-1);

	vector<T> resultData = Merge(MergeSort(leftData), MergeSort(rightData));

	return resultData;
}

int _tmain(int argc, _TCHAR* argv[])
{
	int ia[] = {12, 20, 5, 10, 34, 49, 33, 88, 42, 12};	
	vector<int> Select(ia, ia+10);

	vector<int> Result = MergeSort(Select);

	system("pause");
	return 0;
}