對鍊錶進行插入排序。
插入排序的動畫演示如上。從第乙個元素開始,該鍊錶可以被認為已經部分排序(用黑色表示)。
每次迭代時,從輸入資料中移除乙個元素(用紅色表示),並原地將其插入到已排好序的鍊錶中。
插入排序演算法:
插入排序是迭代的,每次只移動乙個元素,直到所有元素可以形成乙個有序的輸出列表。
每次迭代中,插入排序只從輸入資料中移除乙個待排序的元素,找到它在序列中適當的位置,並將其插入。
重複直到所有輸入資料插入完為止。
假設某個節點之前的部分都是排好序的。要確定當前節點的位置,只需要從前向後遍歷一遍鍊錶,找到插入節點即可。
**一:
該方法中,假設head永遠是有序鍊錶的尾部,因此每次只看head的下乙個節點。如果下乙個節點與head是有序的,則head向後移動乙個。如果是亂序的,則從前向後遍歷有序部分找到插入點。
class
solution
listnode * dummy =
newlistnode(0
),*tmp =
nullptr
; dummy-
>next = head;
while
(head && head-
>next)
tmp = dummy;
while
(tmp-
>next-
>val < head-
>next-
>val)
tmp = tmp-
>next;
listnode * curnode = head-
>next;
head-
>next = curnode-
>next;
curnode-
>next = tmp-
>next;
tmp-
>next = curnode;
}return dummy-
>next;}}
;
**二:
該方法是通過small和large找到當前節點應該插入的位置,如果不在這個範圍為,small和large向後移動一位繼續找。如果large==curnode,表明全部是有序的,繼續判斷下乙個。如果laege!=curnode,則將當前節點插入small和large中間。
class
solution
listnode* dummy =
newlistnode
(int_min)
; dummy-
>next = head;
listnode* curnode = head-
>next;
while
(curnode)
else}if
(large == curnode)
large-
>next = nxtnode;
else
curnode = nxtnode;
}return dummy-
>next;}}
;
Leetcode 147 對鍊錶進行排序
對鍊錶進行插入排序。插入排序演算法 插入排序是迭代的,每次只移動乙個元素,直到所有元素可以形成乙個有序的輸出列表。每次迭代中,插入排序只從輸入資料中移除乙個待排序的元素,找到它在序列中適當的位置,並將其插入。重複直到所有輸入資料插入完為止。示例 1 輸入 4 2 1 3 輸出 1 2 3 4 到了鍊...
LeetCode 147 對鍊錶進行插入排序
插入排序演算法 插入排序是迭代的,每次只移動乙個元素,直到所有元素可以形成乙個有序的輸出列表。每次迭代中,插入排序只從輸入資料中移除乙個待排序的元素,找到它在序列中適當的位置,並將其插入。重複直到所有輸入資料插入完為止。方法1 嚴格按照演算法說明,在原始列表中進行操作,利用4個鍊錶指標分別表示當前元...
LeetCode147 對鍊錶進行插入排序
對鍊錶進行插入排序。插入排序的動畫演示如上。從第乙個元素開始,該鍊錶可以被認為已經部分排序 用黑色表示 每次迭代時,從輸入資料中移除乙個元素 用紅色表示 並原地將其插入到已排好序的鍊錶中。插入排序演算法 插入排序是迭代的,每次只移動乙個元素,直到所有元素可以形成乙個有序的輸出列表。每次迭代中,插入排...