+ -
当前位置:首页 → 问答吧 → 关于归并排序的问题

关于归并排序的问题

时间:2011-07-14

来源:互联网

偶有一个归并排序的实现:
C/C++ code
void merge_sort(int start, int end)
{
    if (start < end - 1) {
        int mid = (start + end) / 2;
        int i = start, j = mid, k = start;
        merge_sort(start, mid);
        merge_sort(mid, end);
        while (i < mid || j < end)
            if (j == end || (i < mid && a[i] <= a[j]))
                t[k++] = a[i++];
            else
                t[k++] = a[j++];
        for (i = 0; i < end; i++)
            a[i] = t[i];
    }
}

int main(void)
{
    merge_sort(0, LEN);
    return 0;
}


偶不明白为什么是if (start < end - 1),而不是if (start < end),也许可以简单回答说是因为LEN本来就比数组最大下标多1,但是改了这个条件不仅仅影响到涉及到数组最大下标的那次合并啊?为什么之前的那些也正确呢?
为了使用merge_sort(0, LEN-1);
我把上述代码改成:
C/C++ code
void merge_sort(int start, int end)
{
    if (start < end) {
        int mid = (start + end) / 2;
        int i = start, j = mid, k = start;
        merge_sort(start, mid);
        merge_sort(mid+1, end);
        while (i < mid || j <= end)
            if (j == end + 1 || (i < mid && a[i] <= a[j]))
                t[k++] = a[i++];
            else
                t[k++] = a[j++];
        for (i = 0; i <= end; i++)
            a[i] = t[i];
    }
}

这就和《算法导论》上的差不多了,但又引出新问题了:为什么这里必须是merge_sort(mid+1, end);而之前那个代码却必须是merge_sort(mid, end);?
调试了半天也没搞明白,请求各位帮助,谢谢。

作者: laciqs   发布时间: 2011-07-14

理由很简单,假设start=0, 原先mid=LEN/2,现在mid=(LEN-1)/2,当LEN=10是 mid=5才正确。

作者: xibeitianlang   发布时间: 2011-07-14

下标的问题,算法导论上归并有两种:使用哨兵位和不适用。
具体代码参考:http://blog.csdn.net/dizuo/article/details/6057479

作者: dizuo   发布时间: 2011-07-14

路过,学习

作者: students_lcc   发布时间: 2011-07-14