147. 對鍊錶進行插入排序
對鍊錶進行插入排序。
插入排序的動畫演示如上。從第乙個元素開始,該鍊錶可以被認為已經部分排序(用黑色表示)。
每次迭代時,從輸入資料中移除乙個元素(用紅色表示),並原地將其插入到已排好序的鍊錶中。
插入排序演算法:
插入排序是迭代的,每次只移動乙個元素,直到所有元素可以形成乙個有序的輸出列表。
每次迭代中,插入排序只從輸入資料中移除乙個待排序的元素,找到它在序列中適當的位置,並將其插入。
重複直到所有輸入資料插入完為止。
示例 1:
輸入: 4->2->1->3
輸出: 1->2->3->4
示例 2:
輸入: -1->5->3->4->0
輸出: -1->0->3->4->5
主要是插入排序:
從左到右遍歷節點,依次從煉表頭開始比較,找到乙個合適的位置插入進去。
# definition for singly-linked list.
# class listnode:
# def __init__(self, x):
# self.val = x
# self.next = none
class
solution
:def
insertionsortlist
(self, head: listnode)
-> listnode:if(
not head)or(
not head.
next):
return head
left = head
while left.
next
:#對第二個開始的數進行判斷
node = left.
next
#取要判斷的數為node
if node.val >= left.val:
#如果node值比大於等於前乙個值,那麼就不變,指標右移。
left = left.
next
continue
left.
next
= node.
next
#如果node值比前乙個值小,說明需要排序,首先斷開node節點。
#設定左右比較值,pre & post
pre = head
post = head.
next
#把node值與pre和post進行比較,主要有三種情況。
while pre != left.
next
:if node.val <= pre.val:
node.
next
= pre
head = node
break
elif pre.val < node.val <= post.val:
pre.
next
= node
node.
next
= post
break
else
: pre = post
post = post.
next
return head
其實完全可以利用前乙個插入的位置進行提速,即每次先把當前要插入的元素和前乙個插入點比較,如果比它大,那麼就從這裡開始搜尋,否則才需要從煉表頭開始搜尋。這裡也是乙個可以優化的地方。
# definition for singly-linked list.
# class listnode:
# def __init__(self, x):
# self.val = x
# self.next = none
class
solution
:def
insertionsortlist
(self, head: listnode)
-> listnode:if(
not head)or(
not head.
next):
return head
left = head
pre_insert = head
while left.
next
: node = left.
next
if node.val >= left.val:
left = left.
next
continue
left.
next
= node.
next
#這裡進行提速,本次插入的值和上一次插入的前一位置值作比較,如果node.val 大於上一次插入前的位置,那麼比較
#的起始位置就是從上一次插入的位置開始。否則就從頭開始搜尋。
if node.val > pre_insert.val:
pre = pre_insert
post = pre.
next
else
: pre = head
post = head.
next
while pre != left.
next
:if node.val <= pre.val:
node.
next
= pre
head = node
break
elif pre.val < node.val <= post.val:
pre.
next
= node
node.
next
= post
pre_insert = pre#儲存上一次插入位置
break
else
: pre = post
post = post.
next
return head
Leetcode 147 對鍊錶進行排序
對鍊錶進行插入排序。插入排序演算法 插入排序是迭代的,每次只移動乙個元素,直到所有元素可以形成乙個有序的輸出列表。每次迭代中,插入排序只從輸入資料中移除乙個待排序的元素,找到它在序列中適當的位置,並將其插入。重複直到所有輸入資料插入完為止。示例 1 輸入 4 2 1 3 輸出 1 2 3 4 到了鍊...
LeetCode 147 對鍊錶進行插入排序
插入排序演算法 插入排序是迭代的,每次只移動乙個元素,直到所有元素可以形成乙個有序的輸出列表。每次迭代中,插入排序只從輸入資料中移除乙個待排序的元素,找到它在序列中適當的位置,並將其插入。重複直到所有輸入資料插入完為止。方法1 嚴格按照演算法說明,在原始列表中進行操作,利用4個鍊錶指標分別表示當前元...
LeetCode147 對鍊錶進行插入排序
對鍊錶進行插入排序。插入排序的動畫演示如上。從第乙個元素開始,該鍊錶可以被認為已經部分排序 用黑色表示 每次迭代時,從輸入資料中移除乙個元素 用紅色表示 並原地將其插入到已排好序的鍊錶中。插入排序演算法 插入排序是迭代的,每次只移動乙個元素,直到所有元素可以形成乙個有序的輸出列表。每次迭代中,插入排...