113. 特殊排序(二分插入)

113. 特殊排序(二分插入)

 应用二分的思想进行优化

假设当前是第k个点

前k-1个点已经排好序了,通过二分的思想在[0,k-1]找到一个可以插入的位置,然后插入

时间复杂度O(N^2)

// Forward declaration of compare API.
// bool compare(int a, int b);
// return bool means whether a is less than b.

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;  //下标从0开始
           
           while(l<r)
           {
               int mid=l+r+1>>1;    //找到位置:左边全部<=i,右边全部>i
               if(compare(res[mid],i))  //mid<i
                    l=mid;
                else
                    r=mid-1;
           }
           res.push_back(i);
           //通过冒泡交换排序,一直移动到应该插入的位置
           for(int j=res.size()-2;j>r;j--)
                swap(res[j+1],res[j]);
            if(compare(i,res[r]))   //如果res小于i,不操作,反之交换
                swap(res[r],res[r+1]);  //这里不能swap(i),因为i已经在数组中了,再插入会出错
       }
       return res;
    }
};

上一篇:Typora+Markdown


下一篇:卸载宝塔面板后无法删除安装目录下的文件 swap .user.ini