快速排序1(演算法只交換節點的val值,平均時間複雜度o(nlogn),不考慮遞迴棧空間的話空間複雜度是o(1))
這裡的partition我們參考陣列快排partition的第二種寫法(選取第乙個元素作為樞紐元的版本,因為鍊錶選擇最後一元素需要遍歷一遍),具體可以參考here
這裡我們還需要注意的一點是陣列的partition兩個引數分別代表陣列的起始位置,兩邊都是閉區間,這樣在排序的主函式中:
void
quicksort(vector<
int
>&arr,
int
low,
int
high)
}
對左邊子陣列排序時,子陣列右邊界是middle-1,如果鍊錶也按這種兩邊都是閉區間的話,找到分割後樞紐元middle,找到middle-1還得再次遍歷陣列,
因此鍊錶的partition採用前閉後開的區間(這樣排序主函式也需要前閉後開區間)
,這樣就可以避免上述問題
class solution
void qsortlist(listnode*head, listnode*tail)
}listnode* partitionlist(listnode*low, listnode*high)
swap(loc->val, low->val);
return loc;
}};
快速排序2(演算法交換鍊錶節點,平均時間複雜度o(nlogn),不考慮遞迴棧空間的話空間複雜度是o(1))
這裡的partition,我們選取第乙個節點作為樞紐元,然後把小於樞紐的節點放到乙個鏈中,把不小於樞紐的及節點放到另乙個鏈中,最後把兩條鏈以及樞紐連線成一條鏈。
這裡我們需要注意的是,1.在對一條子鏈進行partition時,由於節點的順序都打亂了,所以得保正重新組合成一條新煉表時,要和該子鍊錶的前後部分連線起來,因此我們的partition傳入三個引數,除了子鍊錶的範圍(也是前閉後開區間),還要傳入子煉表頭結點的前驅;2.partition後鍊錶的頭結點可能已經改變
class solution
void qsortlist(listnode *headpre, listnode*head, listnode*tail)
}listnode* partitionlist(listnode* lowpre, listnode* low, listnode* high)
else
big->next = high;//保證子鍊錶[low,high)和後面的部分連線
little->next = low;
low->next = node2.next;
lowpre->next = node1.next;//為了保證子鍊錶[low,high)和前面的部分連線
return low;
}};
快速排序及快速選擇終極版
快速排序 quick sort 是一種非常經典高效的排序演算法,採用了基於比較的遞迴分治策略,平均情況下複雜度為o nlogn 但最壞情況下會退化到o n 2 在筆試面試過程中經常會問到有關於快速排序的問題,甚至要求面試者當場手寫 本文將簡單介紹快排原理並提供具體的 實現,以及其在求第n小的數中的經...
excel巨集 終極版
private sub commandbutton1 click sheet1 q20.list sheet2 q20trim.list sheet3 源資料表 副本 新建sheet4 批量合成 刪除空行 變成m 最終資料存於sheet3列pqr 批量合成 dim s as integer s te...
頁面傳參終極版
頁面傳引數是一種比較常見的業務需求,根據實現原理及適用環境可以分為兩大類。在普通瀏覽器端常用的方法有如下幾種 1.利用url傳參 在頁面跳轉的時候通過設定window.location.href新增引數,在接收引數的頁面通過window.location.search獲取引數字串。傳送引數的頁面 w...