题目
1. 编写实现链表排序的一种算法,说明为什么选择这种方法。
2. 编写实现数组排序的一种算法,说明为什么使用这种方法。
解法
1. 对于链表,通常使用归并排序,时间复杂度为O(nlgn),没有新节点创建。
2. 对于数组,通常采用快速排序,平均时间复杂度在比较排序算法中较低O(nlgn),且为原址稳定排序,不需要辅助空间。
3. 此外,对于非比较排序,计数排序和桶排序,它们要求排序的元素在一个给定的范围内[0, k]中,时间复杂度接近线性。
链表的归并排序
LIST-MERGE-SORT(ListNode L.head, int length):
if length == 1:
return L.head;
ListNode pmid = L.head;
for i = 0 to length/2:
pmid = pmid.next;
ListNode p1 = LSIT-MERGE-SORT(L.head, length/2);
ListNode p2 = LIST-MERGE-SORT(mid, length);
MERGE(p1, p2);
MERGE(ListNode p1, ListNode p2):
ListNode p, phead = null;
while p1 != null && p2 != null:
if p1.value < p2.value:
if phead == null:
p = p1;
phead = p1;
else
p1 = p1.next;
p = p.next;
if p1.value > p2.value:
if phead == null:
p = p2;
phead = p2;
else
p2 = p2.next;
p = p.next;
p.next = (p1 == null) ? p2 : p1;
return phead;