鍊錶排序演算法題彙總(插入排序 歸併排序)

2021-10-07 09:32:16 字數 2353 閱讀 7474

對鍊錶進行插入排序(力扣:147)

排序鍊錶(力扣:148) 題目

對鍊錶進行插入排序。

從第乙個元素開始,該鍊錶可以被認為已經部分排序。每次迭代時,從輸入資料中移除乙個元素,並原地將其插入到已排好序的鍊錶中。

分析該題就是乙個插入排序,只不過使用了單鏈表來表示,這就限制了:第一,我們只能使用單向移動;第二,每個元素移動時需要修改它的next屬性。

方法一:新建乙個新的鍊錶,從原煉表中的第乙個元素開始,依次取出元素,跟新鍊錶的第乙個元素開始做比較,插入到合適位置為止。該方法實現,思路簡單,但每次排序都需要遍歷所有已排序的元素,效能稍差。

方法二:可以原鍊錶基礎上進行排序操作。鍊錶分為已排序和未排序兩個部分,每次都從未排序部分的第乙個元素取出,用它來跟已排序部分的最後乙個元素做比較,如果要插入的元素大,則只需要將兩個部分的指標向後移動一位即可,不需要額外操作;否則,如果插入元素小於已排序的最後乙個元素,則需要從已排序的第乙個元素開始,依次對比來查詢插入位置。該方法的優化在於,對於原煉表中已是順序的部分,不用進行任何修改及遍歷操作。

**實現:方法一

/**

* 147. 對鍊錶進行插入排序

* @param head

* @return

*/public listnode insertionsortlist(listnode head)

listnode dummy = new listnode(-1);//結果鍊錶

listnode insert = head, next = head.next, cur, tmp;

while (insert != null)

next = insert.next;

tmp = cur.next;

cur.next = insert;

insert.next = tmp;

insert = next;

}return dummy.next;

}

**實現:方法二(優化方法一)
/**

* 147. 對鍊錶進行插入排序。

* 優化方案,原鍊錶排序,如果鍊錶是遞增的,則不用移動節點。

* @param head

* @return

*/public listnode insertionsortlist2(listnode head)

listnode dummy = new listnode(-1);

dummy.next = head;

//原鍊錶排序,insert表示當前要插入的節點,prev表示已拍好序的最後乙個元素,tmp用於在已排序列表中取出節點和插入節點進行對比

listnode insert = head.next, prev = head, tmp;

while (insert != null)

prev.next = insert.next;

insert.next = tmp.next;

tmp.next = insert;

insert = prev.next;

}else

}return dummy.next;

}

題目

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

分析利用歸併的思想,遞迴地將當前鍊錶分為兩段,然後merge。

主要考察3個知識點:

歸併排序的整體思想

找乙個鍊錶的中間節點

合併兩個已排好序的鍊錶為乙個新的有序鍊錶

**實現

/**

* 148. 排序鍊錶

* @param head

* @return

*/public listnode sortlist(listnode head)

//用快慢指標將鍊錶分為兩個部分

listnode slow = head, quick = head, pre = null;

while (quick != null && quick.next != null)

pre.next = null;

//分別對鍊錶的左右兩部分進行排序

listnode l = sortlist(head);

listnode r = sortlist(slow);

return mergenode(l, r);//最後合併已排好序的左右兩部分。

}private listnode mergenode(listnode l, listnode r)else

}if (l != null)

if (r != null)

return dummy.next;

}

鍊錶的歸併排序,插入排序

來自資料結構與演算法書 進行鍊錶排序並避免建立,刪除新的節點 1.node是結構體模板,linklist是類模板 using namespace std template struct node template class linklist 2 歸併排序 template void linklis...

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

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

鍊錶插入排序

void insertsort list sortascount,node node else p prior next q q next p int sortwithinsetmethod list sortasdata wchar pp p data if isnum pp int i 0 i ...