215. Kth Largest Element in an Array

来源:互联网 发布:传奇手游 源码 编辑:程序博客网 时间:2024/05/14 14:06

classical problem
解法依次为,选择排序,分治排序,堆排序,堆排序+,快排1,快排2,快排2+,快排2++

//360ms select sort//O(kn)class Solution {public:    void get_min(vector<int>& v, int k)    {        int mark=k;        for(int i=k+1;i<v.size();i++)        {            if(v[mark]<v[i]) mark=i;        }        if(mark!=k)        {            int temp=v[mark];            v[mark]=v[k];            v[k]=temp;        }    }    int findKthLargest(vector<int>& nums, int k) {        for(int i=0;i<k;i++)        {            get_min(nums,i);        }        return nums[k-1];    }};
//merge sort 20ms //O(nlgn) class Solution {public:    void merge(vector<int>& v, int l,int m,int r)    {        vector<int> temp(v.begin()+l,v.begin()+m+1);        int k=m+1;        int start=l;        m=m-l;        l=0;        while(l<=m&&k<=r)        {            if(temp[l]<v[k]) v[start++]=v[k++];            else v[start++]=temp[l++];        }        if(l<=m) while(l<=m) v[start++]=temp[l++];    }    void my_sort(vector<int>& v, int l,int r)    {        if(l==r) return;        if(l==r-1)        {            if(v[l]>=v[r]) return;            int temp=v[l];            v[l]=v[r];            v[r]=temp;            return;        }        int m=l+(r-l)/2;        my_sort(v,l,m);        my_sort(v,m+1,r);        merge(v,l,m,r);    }    int findKthLargest(vector<int>& nums, int k) {        my_sort(nums,0,nums.size()-1);        return nums[k-1];    }};
//heap sort 24ms//O(nlogn)class Solution {public:    void keep_max_heap(vector<int>& v,int i,int max_len)    {        int l=i*2+1;        int r=l+1;        int biggest=i;        if(l<max_len&&v[l]>v[i]) biggest=l;        if(r<max_len&&v[r]>v[biggest]) biggest=r;        if(biggest!=i)        {            int temp=v[biggest];            v[biggest]=v[i];            v[i]=temp;            keep_max_heap(v,biggest,max_len);        }                    }    void heap_sort(vector<int>& v)    {        int len=v.size();        for(int i=(len-1)/2;i>=0;i--)            keep_max_heap(v,i,len);        while(len-->1)        {            int temp=v[0];            v[0]=v[len];            v[len]=temp;            keep_max_heap(v,0,len);        }    }    int findKthLargest(vector<int>& nums, int k) {        heap_sort(nums);        return nums[nums.size()-k];    }};
//heap sort 16ms//O(klogn)class Solution {public:    void keep_max_heap(vector<int>& v,int i,int max_len)    {        int l=i*2+1;        int r=l+1;        int biggest=i;        if(l<max_len&&v[l]>v[i]) biggest=l;        if(r<max_len&&v[r]>v[biggest]) biggest=r;        if(biggest!=i)        {            int temp=v[biggest];            v[biggest]=v[i];            v[i]=temp;            keep_max_heap(v,biggest,max_len);        }          }    void heap_sort(vector<int>& v,int k)    {        int len=v.size();        for(int i=(len-1)/2;i>=0;i--)            keep_max_heap(v,i,len);        while(len-->v.size()-k)        {            int temp=v[0];            v[0]=v[len];            v[len]=temp;            keep_max_heap(v,0,len);        }    }    int findKthLargest(vector<int>& nums, int k) {        heap_sort(nums,k);        return nums[nums.size()-k];    }};
//quick_sort 240msclass Solution {public:    void quick_sort(vector<int>& v,int l,int r)    {        if(l>=r) return;        if(l==r-1)        {            if(v[l]<v[r]) return;            int temp=v[l];            v[l]=v[r];            v[r]=temp;            return;        }        int l0=l;        int r0=r;        int mark=v[l++];        while(l<r)        {            while(l<=r0&&v[l]<=mark) l++;            while(r>l0&&v[r]>mark) r--;            if(l<r)            {                int temp=v[l];                v[l]=v[r];                v[r]=temp;            }        }        if(l==l0)         {            quick_sort(v,l0+1,r0);            return;        }        int temp=v[l-1];        v[l-1]=v[l0];        v[l0]=temp;             quick_sort(v,l0,l-2);        quick_sort(v,l,r0);    }    int findKthLargest(vector<int>& nums, int k) {        quick_sort(nums,0,nums.size()-1);        //for(int i=0;i<nums.size();i++) cout<<nums[i]<<" ";        //cout<<endl;        return nums[nums.size()-k];    }};
//296ms quick_sortclass Solution {public:    int find_partition(vector<int>& v,int l,int r)    {        int mark=v[l];        int start=l;        int i=l;        for(int j=l+1;j<=r;j++)        {            if(v[j]<=mark)            {                i++;                if(i!=j)                {                    int temp=v[i];                    v[i]=v[j];                    v[j]=temp;                     }            }        }        int temp=v[i];        v[i]=v[start];        v[start]=temp;          return i;    }    void quick_sort(vector<int>& v,int l,int r)    {        if(l>=r) return;        int q=find_partition(v,l,r);        quick_sort(v,l,q-1);        quick_sort(v,q+1,r);    }    int findKthLargest(vector<int>& nums, int k) {        quick_sort(nums,0,nums.size()-1);        return nums[nums.size()-k];    }};
//72ms//from quick_sortclass Solution {public:    int find_partition(vector<int>& v,int l,int r)    {        int mark=v[l];        int start=l;        int i=l;        for(int j=l+1;j<=r;j++)        {            if(v[j]>=mark)            {                i++;                if(i!=j)                {                    int temp=v[i];                    v[i]=v[j];                    v[j]=temp;                     }            }        }        int temp=v[i];        v[i]=v[start];        v[start]=temp;          return i;    }    void quick_sort(vector<int>& v,int l,int r,int &k)    {        if(l>=r) return;        int q=find_partition(v,l,r);        if(q==k-1) return;        if(q>k-1) quick_sort(v,l,q-1,k);        if(q<k-1) quick_sort(v,q+1,r,k);    }    int findKthLargest(vector<int>& nums, int k) {        quick_sort(nums,0,nums.size()-1,k);        return nums[k-1];    }};
//12ms//随机产生划分点//O(n)class Solution {public:    int find_partition(vector<int>& v,int l,int r)    {        int rand_index=l+rand()%(r-l+1);        if(rand_index!=l)        {            int temp=v[l];            v[l]=v[rand_index];            v[rand_index]=temp;                     }        int mark=v[l];        int start=l;        int i=l;        for(int j=l+1;j<=r;j++)        {            if(v[j]>=mark)            {                i++;                if(i!=j)                {                    int temp=v[i];                    v[i]=v[j];                    v[j]=temp;                     }            }        }        int temp=v[i];        v[i]=v[start];        v[start]=temp;          return i;    }    void quick_sort(vector<int>& v,int l,int r,int &k)    {        if(l>=r) return;        int q=find_partition(v,l,r);        if(q==k-1) return;        if(q>k-1) quick_sort(v,l,q-1,k);        if(q<k-1) quick_sort(v,q+1,r,k);    }    int findKthLargest(vector<int>& nums, int k) {        quick_sort(nums,0,nums.size()-1,k);        return nums[k-1];    }};
0 0
原创粉丝点击