我們知道在比較排序演算法中,歸併排序可以實現o(n*logn)的時間複雜度。對於陣列來說,他不是原地排序,需要申請額外的空間。不過glib是用鍊錶來表示乙個glist的,所以在glist當中,只需要修改鍊錶的前後指標即可。
歸併排序的一般演算法為:
void mergesort(node l, int m , int n)
else
l = l->next; //l指標向後移動
l->prev = lprev;
lprev = l;
}l->next = l1 ? l1 : l2;
l->next->prev = l;
return list.next;
}
從上面的**可以看出,程式實現的過程有三個指標最重要l,l1,l2。l1和l2分別指向要合併的兩條鍊錶並且一直向後移動(只要l1所指的資料比l2所指的資料小,l1就向後移動)。l這個指標一直都向後移動,重新鏈結起每乙個節點。
現在我們來看看glist是如何實現排序的。
static glist*
g_list_sort_real (glist *list,
gfunc compare_func,
gpointer user_data)
l2 = l1->next;
l1->next = null; //這兩句把l2移動到了中間節點,並把鍊錶分為兩條,分別由l2和list指向
return g_list_sort_merge (g_list_sort_real (list, compare_func, user_data),
g_list_sort_real (l2, compare_func, user_data),
compare_func,
user_data); //這乙個函式的呼叫是用遞迴的方法來實現的。g_list_sort_merge可以顯示兩個有序鍊錶的合併,而g_list_sort_real
} //又可以實現鍊錶的排序
這就是glist實現歸併排序的**。不熟悉歸併排序的猿們可以從中學到很多東西啊。
歸併排序實現
1,我認為歸併排序是分治思想的運用,先是把要排序的數列分成兩半,分別對這兩半進行歸併排序,一步步分下去,當分到規模為1時,開始合併兩個已經有序的陣列。2,主要的 是兩個已經有序的陣列的合併,其中涉及的有空間申請的問題和哨兵的使用。具體看 這是初寫的 存在的問題有每次迭代都申請了空間且沒釋放,而且沒有...
歸併排序實現
看到個帖子寫的歸併排序,記錄一下,特別是對鍊錶的使用。歸併的排序分為三步走 1 分割,2 遞迴,3 合併。陣列歸併排序 歸併排序三步走 1 分割子問題 2 遞迴 3 合併子問題。include stdafx.h includeusing namespace std void mergearray i...
歸併排序實現
歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。首先考慮下如何將將二個有序數列合併。這個非常簡單,只要從比較二個數列的第乙個數,誰小就先取誰,取了後就在對應數列中刪除這個數。然後再進行比較,如果有數列為空,那直接將另...