/**
原地归并
*/
void swap(int* vals, int x, int y)
{
vals[x] ^= vals[y];
vals[y] ^= vals[x];
vals[x] ^= vals[y];
}
void reverse(int* vals, int x, int y)
{
while(x < y)
{
swap(vals, x, y);
x++, y--;
}
}
void cycleMove(int* vals, int L, int M, int R)
{
reverse(vals, L, M - 1);
reverse(vals, M, R);
reverse(vals, L, R);
}
void merge(int* vals, int L, int M, int R)
{
int pi = L, pj = M + 1;
while(pi < pj && pj <= R)
{
for(; pi < pj && vals[pi] <= vals[pj]; pi++);
int lastj = pj;
for(; pj <= R && vals[pj] <= vals[pi]; pj++);
cycleMove(vals, pi, lastj, pj - 1);
pi += (pj - lastj);
}
}
void mergeSort(int* vals, int L, int R)
{
if(L >= R) return ;
int M = (L + R) >> 1;
mergeSort(vals, L, M);
mergeSort(vals, M + 1, R);
merge(vals, L, M, R);
}
原地归并实现
最新推荐文章于 2021-02-24 20:26:14 发布