單鏈表的排序

2021-06-19 22:39:30 字數 953 閱讀 2643

歸併排序的一種比較快的排序,尤其在鍊錶中,在所有排序中是時間複雜度為nlog(n)級別的有三種,分別為快速排序,堆排序和歸併排序,但是快速排序在單鏈表中沒有優勢(適合於雙向鍊錶),同樣堆排序在建堆和調整堆得過程對於單鏈表也是比較麻煩,這裡我們選取了歸併排序。

歸併排序的概念和原理我就不介紹了,網上的相關資料比較多。在這裡,我只想記錄乙個思路,歸併的排序分為三步走:1 分割,2 遞迴,3 合併。

首先鍊錶的定義如下:

public class listnode 

}

使用快慢指標,等分單向鍊錶,並呼叫merge函式對鍊錶排序,具體如下:

public listnode mergesort(listnode head) 

// 使用快慢指標將鍊錶等分為兩個鍊錶

while (second.next != null && second.next.next != null)

//斷開

if (first.next != null)

// 只剩乙個節點時,返回

if (first == second)

//遞迴呼叫mergesort方法

return merge(mergesort(first), mergesort(second));

}

按遞增順序,將兩個有序單向鍊錶,歸併成乙個有序單向鍊錶,如下:

public listnode merge(listnode first, listnode second)  else 

tmp.next = merge(first, second); //這個是關鍵

return tmp;

}

單鏈表之排序單鏈表

package list public class sortedsinglylist extends singlylist 將values陣列中的所有物件按值大小插入 public sortedsinglylist t values 過載深拷貝,由單鏈表構建排序單鏈表 public sortedsi...

單鏈表的排序

這是前幾天hottey面試的乙個題目 不借助外部陣列,只對鍊錶本身進行操作來完成排序。我覺得甚有意思,便實現了乙個。程式 如下 include using namespace std template struct node 節點結構 template class slist 單鏈表結構 slist...

單鏈表的排序

單鏈表結點資料結構 typedef struct node node t,list t 1移動結點上的值 1.1 選擇排序 時間複雜度為 o n 2 void list select sort list t h s key p key p key min return 1.2 快速排序 時間複雜度為...