所以目前我有一个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正常工作,但我有点困在这里,因为我不知道在哪里放置我的合并功能。任何提示?
答案 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)
}
}