在對乙個鍊錶進行隨機化時,可以借鑑自頂向下歸併排序的思路,先將鍊錶劃分為左右兩個子鍊錶,分別進行隨機化,然後再歸併兩個子鍊錶,並在歸併過程中進行隨機化,**如下:
// *phead指向鍊錶的首節點(不是頭結點)void randomizelinkedlist(link * phead)
tail->next = null;
}// 隨機化首節點由*phead指向,長度為length的鍊錶,隨機化完成後*phead指向鍊錶新的首節點。該函式類似於自頂向下的歸併排序
randomize(link * phead,int length)
int lengthofleftsublist = length / 2;
int lengthofrightsublist = length - lengthofleftsublist;
link headofrightsublist = * phead;
for(int i = 0;i < countofleftsublist;i++)
randomize(phead,lengthofleftsublist);
randomize(&headofrightsublist,lengthofrightsublist);
merge(phead,length,lengthofleftsublist,headofrightsublist);
}// 鍊錶的首結點由*phead指向,長度為length,對其已經完成隨機化的左右子鍊錶進行歸併,歸併完成後*phead指向鍊錶新的首節點
void merge(link * phead,int length,int lengthofleftsublist,link headofrightsublist)
else
length--;
link tail = * phead;
while(lengthofleftsublist > 0)
else
length--;
tail = tail->next;
} if(length > 0) }
bool getprobability(double probability)
自頂向下的原地歸併排序
歸併排序是一種簡單的遞迴排序演算法。思路 歸併排序即是將兩個有序的陣列歸併成乙個更大的有序陣列。那麼我們要將乙個陣列排序,我們可以先將這個陣列分成兩半分別排序,然後將結果歸併起來。其 歸併排序的速度非常快,但是卻需要額外的空間。為什麼需要額外的空間尼?因為我們使用歸併排序時是將兩個不同的有序陣列歸併...
歸併排序 自頂向下 陣列實現
歸併 即merge函式 二路歸併排序舉例 分為有序子表a,有序子表b。a中首個元素與b中首個元素比較 若a1小於b1,取出a1,比較a2與b1 若a1大於b1,取出b1,比較a1與b2。依次類推。遞迴 即mergesort函式 分解問題 include include 對應malloc函式與free...
自頂向下和自底向上的歸併排序區別
歸併排序中最基本的操作是 歸併 即將兩個 2 路歸併 或兩個以上的有序陣列組合成乙個更大的有序陣列。按照歸併順序的不同,歸併排序可以分為自頂向下和自底向上兩類。自頂向下的歸併排序進行的操作主要就是對陣列的拆分與合併。通過層層拆分得到單元素陣列,天生有序,然後歸併兩個單元素陣列得到乙個較大的有序陣列,...