原地归并实现

来源:互联网 发布:微信windows手机版 编辑:程序博客网 时间:2024/05/16 10:49
/**原地归并*/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);}

0 0