特殊排序——二分+插入排序
本題與一般排序有三個區別:
- 互動式,你並不知道大小關係,只能通過呼叫compare介面詢問
- 大小不具備傳遞性,比如$a < b,b < c$ 並不能推出$a < c$
- 不能超過一萬次詢問,資料範圍為1000,nlogn略小於一萬
對於其第二個性質僅僅導致答案不唯一,題目僅要求輸出一種答案,所以可以忽視該條件
採用二分插入排序解決該問題,首先將第一個元素壓入答案序列中,然後二分找到合適的位置$r$,將待插入元素插入到$r$位置,從後往前不斷交換相鄰的兩個數直到待插入的元素到達指定位置
注意該二分演算法的寫法,迴圈退出時$l$比$r$小一,意味著$r$位置的必然小於待插入的元素,$r+1$及其之後的元素都大於待插入的元素
class Solution { public: vector<int> specialSort(int N) { vector<int> res; res.push_back(1); for(int i = 2;i <= N;i++){ int l = 0,r = res.size() - 1; while(l <= r){ int mid = l + r >> 1; if(compare(res[mid],i)) l = mid + 1; elser = mid - 1; } res.push_back(i); for(int j = res.size() - 2;j > r;j--)swap(res[j],res[j + 1]); } return res; } };