鏈表(免責聲明:學校)據我所知如何排序合併與O(nlogn)時間和O(1)空間複雜度
,遞歸分割一個鏈表,然後發送它關閉另一個合併函數是O(nlogn)時間和O(n)空間。是否有可能在O(nlogn)時間和O(1)空間複雜度的鏈表上進行mergesort?你會如何去做這件事?
任何幫助表示讚賞
PS:確保傳統歸併爲空間複雜度O(N),這是O(n)的一個例子,對不對?如何改變O(1)空間?
void sortTrack() {
Node merge = this.head;
this.head = Node (merge);
}
public Node mergeSort(Node head){
if ((head == null)||(head.next == null)){
return head;
}
Node left = head;
Node right = head.next;
while((right != null) && right.next != null){
head = head.next;
right = right.next.next;
}
right = head.next;
head.next = null;
return merge(mergeSort(left), mergeSort(right));
}
public Node merge(Node left, Node right){
Node head = new Node();
Node temp = head;
while((left != null) && (right !=null)){
if(left <= right){
temp.next = left;
temp = left;
left = left.next;
}
else{
temp.next = right;
temp = right;
right = right.next;
}
}
if(right == null)
temp.next = left;
else
temp.next = right;
return head.next;
}
感謝您的分解。你介意給我一個例子或者僞代碼或者其他的東西嗎?我不知道如何實施自下而上的方法 –
@RobBor:我已經爲你添加了更多的細節。 – ruakh
@RobBor - wiki有一個[自下而上的鏈接列表合併排序]示例(https://en.wikipedia.org/wiki/Merge_sort#Bottom-up_implementation_using_lists),它使用一個小的(25到32)固定大小的數組指針或內部工作列表的節點引用,這將被視爲恆定的空間複雜度O(1)。 – rcgldr