排序-归并排序

typedef int (* Compare)(const void *key1, const void *key2);

static int Merge(void *sort, unsigned int eleSize, int left, int midle, int right, Compare compare)
{
    int ipos = left;
    int jpos = midle + 1;
    int mpos = 0;
    char *data = (char *)sort;
    char *result = malloc(eleSize * (right - left + 1));
    if (result == NULL) {
        return -1;
    }

    while ((ipos <= midle) || (jpos <= right)) {
        if (ipos > midle) {
            while (jpos <= right) {
                memcpy(&result[mpos * eleSize], &data[jpos * eleSize], eleSize);
                jpos++;
                mpos++;
            }
            continue;
        } else if (jpos > right) {
            while (ipos <= midle) {
                memcpy(&result[mpos * eleSize], &data[ipos * eleSize], eleSize);
                ipos++;
                mpos++;
            }
            continue;
        }

        if (compare(&data[ipos * eleSize], &data[jpos * eleSize]) < 0) {
            memcpy(&result[mpos * eleSize], &data[ipos * eleSize], eleSize);
            ipos++;
            mpos++;
        } else {
            memcpy(&result[mpos * eleSize], &data[jpos * eleSize], eleSize);
            jpos++;
            mpos++;
        }
    }

    memcpy(&data[left * eleSize], result, eleSize * mpos);
    free(result);
    return 0;
}

static int MergeSort(void *sort, unsigned int eleSize, int left, int right, Compare compare)
{
    int j;

    if (left >= right) {
        return 0;
    }

    j = (right - left) / 2 + left;
    if (MergeSort(sort, eleSize, left, j, compare) != 0) {
        return -1;
    }

    if (MergeSort(sort, eleSize, j + 1, right, compare) != 0) {
        return -1;
    }

    return Merge(sort, eleSize, left, j, right, compare);
}

int MgSort(void *sort, unsigned int eleSize, int size, Compare compare)
{
    if ((sort == NULL) || (eleSize == 0) || (size == 0) || (compare == NULL)) {
        return -1;
    }

    return MergeSort(sort, eleSize, 0, size - 1, compare);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值