歸併排序

如果歸併排序中待歸併的兩個相鄰序列分別Wi是r[start]~r[mid]和r[mid+1]~r[end],需要將其歸併成一個新序列r1[start]~r1[end]:

void merge(int r[], int r1[], int start, int mid, int end)
{
    int i = start, j = mid + 1, k = start;
    while (i <= mid && j <= end)
        r1[k++] = (r[i] < r[j] ? r[i++] : r[j++]);
    memcpy(r1 + k, r + i, (mid - i + 1) * sizeof(int)); k += mid - i + 1;
    memcpy(r1 + k, r + j, (end - j + 1) * sizeof(int)); k += end - j + 1;
}

一趟歸併排序:

void MergePass(int r[], int r1[], int n, int h)
{
    int i = 1;
    while (i < n - h * 2 + 1)
    {
        merge(r, r1, i , i + h - 1, i + h * 2 - 1);
        i += (h * 2);
    }

    if (i < n - h + 1) merge(r, r1, i, i + h - 1, n);
    else memcpy(r1 + i, r + i, (n - i + 1) * sizeof(int));
}

歸併排序主函數:

void MergeSort(int r[], int n)
{
    int *r1 = new int [n + 1];
    int h = 1;
    while (h < n)
    {
        MergePass(r, r1, n, h);
        h <<= 1;
        if (h >= n)
        {
            memcpy(r, r1, (n + 1) * sizeof(int));
            break;
        }
        MergePass(r1, r, n, h);
        h <<= 1;
    }

    delete r1[];
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章