對鍊錶進行插入排序。
插入排序的動畫演示如下。從第乙個元素開始,該鍊錶可以被認為已經部分排序(用黑色表示)。
每次迭代時,從輸入資料中移除乙個元素(用紅色表示),並原地將其插入到已排好序的鍊錶中。
插入排序演算法:
插入排序是迭代的,每次只移動乙個元素,直到所有元素可以形成乙個有序的輸出列表。
每次迭代中,插入排序只從輸入資料中移除乙個待排序的元素,找到它在序列中適當的位置,並將其插入。
重複直到所有輸入資料插入完為止。
示例 1:
輸入: 4->2->1->3
輸出: 1->2->3->4
示例 2:
輸入: -1->5->3->4->0
輸出: -1->0->3->4->5
這道題的圖容易讓人產生誤解,按照圖中顯示,每個元素都是從後往前進行比較的,而單向鍊錶支援從後往前訪問。了解這個誤區後,我們再想想,既然是從前往後遍歷,我們不妨建立乙個新的鍊錶,新鍊錶的初始只有乙個節點,就是原鍊錶的頭結點,原鍊錶依次往後遍歷,每乙個節點都有序插入到新鍊錶中,左後得到的新鍊錶就是有序的。
這是原鍊錶
建立乙個新的鍊錶,第乙個節點為原鍊錶的頭結點,原鍊錶的第二個節點現在要有序插入到新鍊錶中,此次插入為頭插
插入後,原鍊錶繼續往下遍歷
再次往下遍歷插入
直到cur為空結束
/**
* definition for singly-linked list.
* struct listnode ;
*/typedef
struct listnode node;
struct listnode*
insertionsortlist
(struct listnode* head)
node* sorthead = head;
//定義新的鍊錶,把原鍊錶的每個節點有序插入到新鍊錶中去
node* cur = head->next;
node* sorttail = head;
//新鍊錶的尾結點,方便尾插
sorttail->next =
null
;//尾結點的next域置空
while
(cur)
if(sortcur ==
null
)else
if(prev ==
null
)else
} head = sorthead;
return head;
//返回原鍊錶的頭
力扣c語言實現 147 對鍊錶進行插入排序
對鍊錶進行插入排序。插入排序演算法 插入排序是迭代的,每次只移動乙個元素,直到所有元素可以形成乙個有序的輸出列表。每次迭代中,插入排序只從輸入資料中移除乙個待排序的元素,找到它在序列中適當的位置,並將其插入。重複直到所有輸入資料插入完為止。示例 1 輸入 4 2 1 3 輸出 1 2 3 4 示例 ...
對鍊錶進行插入排序
1.問題描述 對鍊錶進行插入排序。插入排序的動畫演示如上。從第乙個元素開始,該鍊錶可以被認為已經部分排序 用黑色表示 每次迭代時,從輸入資料中移除乙個元素 用紅色表示 並原地將其插入到已排好序的鍊錶中。插入排序演算法 插入排序是迭代的,每次只移動乙個元素,直到所有元素可以形成乙個有序的輸出列表。每次...
對鍊錶進行插入排序
對鍊錶進行插入排序。插入排序演算法 插入排序是迭代的,每次只移動乙個元素,直到所有元素可以形成乙個有序的輸出列表。每次迭代中,插入排序只從輸入資料中移除乙個待排序的元素,找到它在序列中適當的位置,並將其插入。重複直到所有輸入資料插入完為止。示例 1 輸入 4 2 1 3 輸出 1 2 3 4 示例 ...