我想合併排序在C列表中,我看到代碼here on French Wikipedia,但它給了我一個不正確的列表(即不排序)。該函數雖然編譯完美。請注意,我並沒有真正使用top
,我可能很快將其從結構上取下來。你能幫我弄清楚這段代碼有什麼問題嗎?我不得不將它從算法僞代碼翻譯成C代碼。 謝謝。合併排序循環鏈表C
P
是未排序的輸入列表。 n
是列表的長度。
typedef struct s_stack t_stack;
struct s_stack {
int nbr;
int top;
struct s_stack *previous;
struct s_stack *next;
};
typedef t_stack *Pile;
t_stack *merge_sort(Pile p, int n) {
Pile q;
int Q;
int P;
q = NULL;
Q = n/2;
P = n - Q;
if (P >= 2) {
q = merge_sort(p, P);
if (Q >= 2)
p = merge_sort(q, Q);
} else {
q = p->next;
}
q = fusion(p, P, q, Q);
return (q);
}
t_stack *fusion(Pile p, int P, Pile q, int Q) {
t_stack *tmp;
tmp = NULL;
while (1) {
if (p->next->nbr > q->next->nbr) {
/* my input list (not sorted) is circular and
I checked it is well linked ! This is the reason
why I need to do all that stuff with the nodes
It is basically supposed to move the node q->next
after node p */
tmp = q->next;
q->next = tmp->next;
q->next->previous = q;
tmp->previous = p;
tmp->next = p->next;
p->next->previous = tmp;
p->next = tmp;
if (Q == 1)
break;
Q = Q - 1;
} else {
if (P == 1) {
while (Q >= 1) {
q = q->next;
Q = Q - 1;
}
break;
}
P = P - 1;
}
p = p->next;
}
return (q);
}
1.減少名稱的數量本質上是相同的東西。 2.不要將指針隱藏在typedef後面。 3.記錄'nbr'和'top'的含義。基本上,數據結構應該是什麼樣子。 4.兩個輔助函數可能是有用的:「拼接」和「剪切」。 – Deduplicator
在typedef後面隱藏'*'是一種非常糟糕的程序實踐,可能會導致錯誤理解並使代碼更難以理解,調試和維護。 – user3629249