迭代与堆栈合并

时间:2015-03-24 16:30:41

标签: c mergesort

所以目前我有一个mergesort函数,它使用while循环来合并数组:

void myMergesort(void **A, int n, int(cmp)(void *, void*)) {
    Stack *s; 
    int l = 0, h = n - 1;
    stack_push(s, (void *)l);
    stack_push(s, (void *)h);
    while (!stack_isEmpty(s)) {
        h = (int)stack_pop(s);
        l = (int)stack_pop(s);
        int m = (l + h) / 2;
        if (l < m) {
            stack_push(s, (void *)l);
            stack_push(s, (void *)m);
        }
        if (m+1 < h) {
            stack_push(s, (void *)m+1);
            stack_push(s, (void *)h);
        }
        merge(A, l, m, h, cmp);
    }
}

合并函数只是标准合并函数,它创建了两个A [l到m]和A [m + 1到h]的数组

我认为我非常接近使用堆栈使mergesort正常工作,但我有点困在这里,因为我不知道在哪里放置我的合并功能。任何提示?

1 个答案:

答案 0 :(得分:0)

您可以使用状态变量来指示是否需要拆分或合并索引范围。此外,我更喜欢使用结束索引而不是最后一个索引(因此不需要m + 1)。

    if(n < 2)return
    push state_split
    push n
    push 0
    while(not empty){
        pop l
        pop h
        pop state
        m = (l+h)/2
        if(state == state_split){
            if((h-l) > 1){
                push state_merge
                push h
                push l
                push state_split
                push h
                push m
                push state_split
                push m
                push l
            }
        } else {
            merge(A, l, m, h)
        }
    }