您的位置:首页 > 其它

归并排序(mergeSort)

2016-03-26 11:06 363 查看
#include <iostream>
#include <math.h>

//合并两个排序好的数组
void Merge(int* parray, int start, int middle, int end)
{
std::cout<<start<<"+"<<middle<<"+"<<end<<std::endl;
int n1 = middle -start+1;
int n2 = end - middle;
int* pLarray = new int[n1];
int* pRarray = new int[n2];
for (int i = 0; i < n1; i++)
{
pLarray[i] = parray[start + i];
}
for (int i = 0; i < n2; i++)
{
pRarray[i] = parray[middle + i+1];
}
//运用算法导论中在数组底部加入哨兵牌,以推断出那个数组到底了
//这里不采用哨兵牌的方式
int i = 0;
int j = 0;
int k = start;
while (i<n1&&j<n2)
{
if (pLarray[i]<pRarray[j])
{
parray[k++] = pLarray[i++];
}
else
{
parray[k++] = pRarray[j++];
}
}

for (; i < n1 ;i++)  //左边数组有剩余元素时
{
parray[k++] = pLarray[i];
}
for (; j < n2 ;j++)  //右边数组有剩余元素时
{
parray[k++] = pRarray[j];
}
//输出
for (int a = start;a <end+1; a++)
{
std::cout<<parray[a]<<"  ";
}
std::cout<<std::endl;

if (pRarray != NULL)
{
delete pRarray;
}
if (pLarray != NULL)
{
delete pLarray;
}

}

//归并排序递归的主体。
void   MergeSort(int * parray,int start, int end)
{
std::cout<<start<<"+"<<end<<std::endl;
int middle;
if (start<end)
{
middle = floor((end + start)/2.);
MergeSort(parray,start,middle);
MergeSort(parray,middle+1,end);
Merge(parray,start,middle,end);
}
}

//测试程序
int main()
{
//产生一个待排序的数组
int* pA = new int[888];
for (int i=0;i<888;i++)
{
pA[i] = std::rand()%888;
}
for (int i=0; i<888; i++)
{
std::cout<<pA[i]<<std::endl;
}
MergeSort(pA,0,887);

//输出
for (int i=0; i<888; i++)
{
std::cout<<pA[i]<<std::endl;
}
system("pause");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  归并排序