對鍊錶進行插入排序(C語言實現)

2021-10-14 07:54:21 字數 1761 閱讀 7804

對鍊錶進行插入排序。

插入排序的動畫演示如下。從第乙個元素開始,該鍊錶可以被認為已經部分排序(用黑色表示)。

每次迭代時,從輸入資料中移除乙個元素(用紅色表示),並原地將其插入到已排好序的鍊錶中。

插入排序演算法:

插入排序是迭代的,每次只移動乙個元素,直到所有元素可以形成乙個有序的輸出列表。

每次迭代中,插入排序只從輸入資料中移除乙個待排序的元素,找到它在序列中適當的位置,並將其插入。

重複直到所有輸入資料插入完為止。

示例 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 示例 ...