對鍊錶進行插入排序(力扣: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 ...