归并算法
使用master公式计算最大时间复杂度
归并排序:a == 2, b == 2, d == 1;
代码
//2021/05/10H:\笔试题\左神算法课\左神算法课.vcxproj
#include <iostream>
using namespace std;
int Merge(int* buf, int L, int M, int R);
//归并排序
int Sort(int* buf, int left, int right)
{
if (left == right) return 0;
int middle = left + (right - left)/2;
return Sort(buf, left, middle) +
Sort(buf, middle + 1, right) +
Merge(buf, left, middle, right);
}
int Merge(int* buf, int L, int M, int R)
{
static int count = 0; //待返回的逆序对个数
int* helpBuf = new int[R - L + 1]; //辅助数组用来装顺序交换后的数组元素
int i = 0;
int p1 = L;
int p2 = M + 1;
while (p1 <= M && p2 <= R) //当左右部分各不超过自己的右边界时
{
helpBuf[i++] = buf[p1] < buf[p2] ? buf[p1++] : buf[p2++];
if (buf[p1] > buf[p2]) count++; //如果左大于右,逆序对++
}
while (p1 <= M)
{
helpBuf[i++] = buf[p1++];
}
while (p2 <= R)
{
helpBuf[i++] = buf[p2++];
}
for (int i = 0; i < (R - L + 1); i++)
{
buf[i + L] = helpBuf[i];
}
delete[] helpBuf;
return count;
}
//打印
void myPrint(int* buf, int buflen)
{
if (!buf) return;
for (int i = 0; i < buflen; i++)
{
cout << buf[i] << " ";
}
cout << endl;
}
int main()
{
int buf[] = { 10,2,1 };
int buflen = sizeof(buf) / sizeof(int);
myPrint(buf, buflen);
cout << Sort(buf, 0, buflen - 1) << endl;
myPrint(buf, buflen);
cout << "hello world!" << endl;
system("pause");
return 0;
}