自頂向下歸併排序的應用 鍊錶的隨機化

2022-08-11 07:51:11 字數 1096 閱讀 1595

在對乙個鍊錶進行隨機化時,可以借鑑自頂向下歸併排序的思路,先將鍊錶劃分為左右兩個子鍊錶,分別進行隨機化,然後再歸併兩個子鍊錶,並在歸併過程中進行隨機化,**如下:

// *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 路歸併 或兩個以上的有序陣列組合成乙個更大的有序陣列。按照歸併順序的不同,歸併排序可以分為自頂向下和自底向上兩類。自頂向下的歸併排序進行的操作主要就是對陣列的拆分與合併。通過層層拆分得到單元素陣列,天生有序,然後歸併兩個單元素陣列得到乙個較大的有序陣列,...