/*
归并排序:(分治算法)
先递归调用MergeSort分裂直至只剩下一个元素,然后调用Merge辅助函数合并两个有序数组。
*/
#include <iostream>
#include <time.h>
using namespace std;
#define N 10
void PrintArr(int *pnArr, int nLen)
{
int i;
for (i = 0; i < nLen; i++)
{
cout<<pnArr[i]<<" ";
}
cout<<endl;
}
void Merge(int *pnArr, int nLeft, int nMid, int nRight)
{
int nLenL = nMid - nLeft + 1;
int nLenR = nRight - nMid;
int *pnArrL = new int[nLenL];
int *pnArrR = new int[nLenR];
int i, j, k;
k = 0;
for (i = nLeft; i <= nMid; i++)
{
pnArrL[k++] = pnArr[i];
}
k = 0;
for (j = nMid+1; j <= nRight; j++)
{
pnArrR[k++] = pnArr[j];
}
k = nLeft;
i = 0;
j = 0;
while (i < nLenL && j < nLenR)
{
if (pnArrL[i] < pnArrR[j])
{
pnArr[k++] = pnArrL[i++];
}
else
{
pnArr[k++] = pnArrR[j++];
}
}
while (i < nLenL)
{
pnArr[k++] = pnArrL[i++];
}
while (j < nLenR)
{
pnArr[k++] = pnArrR[j++];
}
delete []pnArrL;
delete []pnArrR;
}
//从小到大排序
void MergeSort(int *pnArr, int nLeft, int nRight)
{
if (nLeft < nRight)
{
int nMid = nLeft + (nRight - nLeft) / 2;
MergeSort(pnArr, nLeft, nMid);
MergeSort(pnArr, nMid+1, nRight);
Merge(pnArr, nLeft, nMid, nRight);
}
}
int main()
{
int nArr[N] = {0};
int i;
srand(time(NULL));
for (i = 0; i < N; i++)
{
nArr[i] = rand() % 100;
}
PrintArr(nArr, N);
MergeSort(nArr, 0, N-1);
PrintArr(nArr, N);
return 0;
}
归并排序
最新推荐文章于 2024-12-15 17:47:59 发布