鍊錶排序演算法

2021-08-29 03:01:13 字數 1274 閱讀 2515

1)題目

對亂序的鍊錶進行排序,要求空間複雜度為常數。(leetcode 148 中等)

輸入: 4->2->1->3

輸出: 1->2->3->4

輸入: -1->5->3->4->0

輸出: -1->0->3->4->5

2)思路

對於這題我有兩種解法,一種是時間複雜度o(n2)

對於暴力解法,我們會將整個鍊錶分為「有序段」和「無序段」兩段。設立乙個虛擬的頭指標q,其next域指向「有序段」的第乙個節點;再設定乙個指標p直接指向無序鍊錶的第乙個節點。其排序思路是將無序鍊錶中的第乙個節點p與有序鍊錶中的所有節點挨個比較(通過不停移動q指標實現),找到合適的位置插入p即可。在剛開始的時候有序鍊錶中只有原煉表中的第乙個節點,無序鍊錶則有剩下的全部節點。由此可以看出總的時間複雜度為o(n2)

對於歸併解法,歸併的思想是不停的尋找鍊錶的中間位置,並且通過遞迴將整個鍊錶拆分成多個長度為1或者2的小鍊錶,在基礎上按大小順序合併成新的鍊錶。這個思想在陣列的排序中很好理解,但是在鍊錶的排序中需要注意a.將每段最後乙個元素的next域指向空;b.構造乙個next域指向合併後有序鍊錶的第乙個節點的虛擬指標;由此可見總的時間複雜度為o(nlogn)

2)**

// 1.複雜度o(n^2)的暴力解法

public static listnode sortlist1(listnode head)

return record.next;

} // 2.複雜度o(nlogn)的歸併解法

public static listnode sortlist2(listnode head)

// 首先找到鍊錶中的中間節點

static listnode getmidnode(listnode head)

return slow;

} // 基於歸併排序的思想,這裡傳入的鍊錶a與鍊錶b都是有序的

static listnode merge(listnode heada, listnode headb) else

head = head.next;

} head.next = heada == null ? headb : heada;

return record.next;

}

演算法 鍊錶排序

sort a linked list in o n log n time using constant space complexity.example 1 example 2 歸併排序 首先將鍊錶從中部切分為兩個部分,不斷遞迴這個過程 遞迴回溯的時候將兩個鍊錶歸併為有序鍊錶 public list...

排序演算法 鍊錶實現

陣列的高效體現於隨機訪問,插排 快排等排序演算法未用到這一特點,故這兩種排序演算法可基於鍊錶實現 插入排序 迭代器 p順序訪問鍊錶 迭代器 i順序訪問前 p 個元素 主要的操作為 當p i p.value刪除原位置的 p將p插入 i 1 與 i 之間 若為單向鍊錶,儲存 i 1與 p 1 演算法複雜...

排序演算法和鍊錶

void swap int a,int b 2.加法 void swap int a,int b 3.異或 相同為0,不同為1.可以理解為不進製加法 void swap int a,int b 2 求最大公約數。1.直接遍曆法 int maxcommondivisor int a,int b ret...