【Data_Structure笔记6】排序算法之【二路归并排序】

/************************************************************************************************************************
文件说明:
        二路归并排序
*************************************************************************************************************************/
#include<iostream>
#include<string>
#include<string.h>
using namespace std;

/************************************************************************************************************************
函数说明:
        【1】Merge()函数的功能是将前后相邻的【两个有序表】归并为一个有序表的算法。
		【2】该两段有序表A[Low....Mid]、A[Mid+1......High]存放在同一顺序表中相邻的位置上,先将它们复制到【辅助数组B中】。
		     每次从B中的两个段取出一个记录进行关键字的比较,将较小的关键字放入A中。
		【3】当数组B中有一段超过其表长时,将另一段中的剩余部分直接复制到A中。
*************************************************************************************************************************/
template<typename ElemType>void MergeArray(ElemType arrayT[], int iLow, int iMid, int iHigh, ElemType pTempArray[])
{                                               //【1】序列表的前后两端各自有序,将它们合并成一个有序的列表
	int i = iLow;
	int j = iMid + 1;
	int k = 0;

	while (i<=iMid&&j<=iHigh)     
	{
		if (arrayT[i]<= arrayT[j])            //【2】比较序列表前后两端中的元素
		{
			pTempArray[k++] = arrayT[i++];    //【3】将较小的值复制到辅助数组pTempArray
		}
		else
		{
			pTempArray[k++] = arrayT[j++];
		}
	}//while
	
	while(i<=iMid)                           //【4】若第一个表未检测完,复制
	{
		pTempArray[k++] = arrayT[i++];
	}
	
	while(j<=iHigh)                          //【5】若第二个表未检测完,复制
	{
		pTempArray[k++] = arrayT[j++];
	}
	
	for (i=0;i<k;i++)                        //【6】将排好序的序列复制到原始序列中,则原始序列为本次排序之后的结果
	{
		arrayT[iLow + i] = pTempArray[i];
	}
}

template<typename ElemType>void MergeSort(ElemType arrayT[], int iLow, int iHigh, ElemType pTempArray[])
{
	if (iLow<iHigh)
	{
		int iMid = (iLow + iHigh) / 2;                          //【1】从中间划分为两个子序列
		MergeSort<int>(arrayT, iLow, iMid, pTempArray);         //【2】对左侧的子序列进行递归排序
		MergeSort<int>(arrayT, iMid + 1, iHigh, pTempArray);    //【3】对右侧的子序列进行递归排序
		MergeArray<int>(arrayT, iLow, iMid, iHigh, pTempArray); //【4】最终,将两个有序序列合并起来
	}
}
/************************************************************************************************************************
模块说明:
        控制台应用程序的入口点
*************************************************************************************************************************/
int main(int argc,char* argv[])
{

	int        arrayT[15] = {22,32,44,34,56,21,24,345,213,234,245,127,113,119,933};
	int*       pTempArray = (int*)std::malloc(15*sizeof(int));  //【1】定义一个辅助数组B


	memset(pTempArray,0,(15*sizeof(int)));
	MergeSort<int>(arrayT,0,14,pTempArray);


	std::cout<<"===================================================="<<std::endl;
	for(int i=0;i<15;i++)
	{
		std::cout<<pTempArray[i]<<std::endl;
	}

	std::system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值