C 之鍊錶的三種排序 歸併 插入 快速

2021-10-09 10:34:19 字數 1543 閱讀 5430

148. 排序鍊錶

在 o(n log n) 時間複雜度和常數級空間複雜度下,對鍊錶進行排序。

示例 1:

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

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

歸併排序

之前我們寫過乙個歸併排序:leetcode之鍊錶排序-歸併排序

採用分治的思想,先寫出兩個鍊錶的合併,再進行分。。

/**

* definition for singly-linked list.

* struct listnode

* };

*/class

solution

pre-

>next=

nullptr

;return

addtwo

(sortlist

(head)

,sortlist

(low));

} listnode*

addtwo

(listnode* l1,listnode* l2)

else}}

;

插入排序

插入排序類似於向量中元素的插入排序:把待排序的結點插入到前面已經排序好的子鍊錶中。

/**

* definition for singly-linked list.

* struct listnode

* };

*/class

solution

low-

>next=fast-

>next;

fast-

>next=temp-

>next;

temp-

>next=fast;

fast=low-

>next;

}else

}return dummy-

>next;}}

;

快速排序

注意swap函式的寫法,分割槽是非常有意思的!!

/**

* definition for singly-linked list.

* struct listnode

* };

*/class

solution

listnode*

sortlist

(listnode* head)

void

quicksort

(listnode* head,listnode* tail)

cur = cur-

>next;

}swap

(head, left)

;quicksort

(head, left)

;quicksort

(left-

>next, tail);}

};

鍊錶實現歸併(快速 插入)排序

歸併排序 思路 1 將待排序陣列 鍊錶 取中點並一分為二 2 遞迴地對左半部分進行歸併排序 3 遞迴地對右半部分進行歸併排序 4 將兩個半部分進行合併 merge 得到結果。編寫分為以下三步 1 找到鍊錶中點 快慢指標思路,快指標一次走兩步,慢指標一次走一步,快指標在鍊錶末尾時,慢指標恰好在鍊錶中點...

三種排序演算法 歸併排序 快速排序,堆排序

歸併排序 建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列 即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。歸併排序演算法穩定,陣列需要o n 的...

O lgn 的三種排序,快速排序 歸併排序 堆排序

快速排序 取某個數作為中間數來進行比較,不斷的交換陣列中的兩個數,分成小於中間數和大於中間數的兩個分組,再對分組做快速排序 也就是用遞迴的思想 歸併排序 從中間把陣列分成兩部分,每部分都進行一次歸併排序 遞迴 然後再使用merge把這兩部分已排完序的陣列合併成順序陣列。堆排序 1 保持堆特性 左右兩...