算法复习:手推快排

与世无争的帅哥 提交于 2020-01-30 00:04:09

leedcode 215. 数组中的第K个最大元素

快排每次寻找都会确定一个元素的真实位置

快排的思想:

先定第一个位置是坑,取出第一个位置的值作为最终要确定位置的值,设置up指针和down指针

由于一开始坑的位置和up重合,直接判断坑的值和down的值大小,此时坑>down需要换坑位置,交换以后down的值付给原来的坑,新坑的位置和down重合,up后移一个

再比较,up<坑,继续后移up一个单位;此时up>坑,需要换坑的位置,此时的up值赋给旧坑,up的位置变成新坑,以此类推。

 

代码:

class Solution {
public:
    int deal(int donser[],int k,int num)
    {
        int up,down,out,sit,*lable;
        lable=new int[num];
        for(int ii=0;ii<num;ii++)
            lable[ii]=0;
        while(1)
        {
            up=0;//找up down位置
            down=num-1;
            for(int i=0;i<num;i++)
            {
                if(lable[i]==0)
                {
                    up=i;
                    break;
                }
            }
            for(int i=num-1;i>0;i--)
            {
                if(lable[i]==0)
                {
                    down=i;
                    break;
                }
            }
            out=donser[up];//要确定位置的值
            sit=up;//坑
            while(up<down)
            {
                if(sit==up)
                {
                    if(out<=donser[down])
                    {
                        down--;
                        continue;
                    }
                    if(out>donser[down])
                    {
                        donser[sit]=donser[down];
                        donser[down]=out;
                        sit=down;
                        up++;
                        continue;
                    }
                }
                else if(sit==down)
                {
                    if(out>=donser[up])
                    {
                        up++;
                        continue;
                    }
                    if(out<donser[up])
                    {
                        donser[sit]=donser[up];
                        donser[up]=out;
                        sit=up;
                        down--;
                        continue;
                    }
                }
            }
            lable[sit]=1;
            if(sit==num-k)
                break;
        }
        return donser[sit];
    }
    int findKthLargest(vector<int>& nums, int k) {
        int i=nums.size(),*donser;
        donser=new int[i];
        for(int c=0;c<i;c++)
            donser[c] = nums[c];
        if(i==1)
            return donser[0];
        return deal(donser,k,i);
    }
};
leedcode 215

 快速实现代码:

#include<algorithm>
#include<string.h>
int qsor(const void *a,const void *b)
{
    return *(int *)a-*(int *)b;
}
class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
        int i=nums.size(),*donser;
        donser=new int[i];
        for(int c=0;c<i;c++)
            donser[c] = nums[c];
        qsort(donser,i,sizeof(int),qsor);
        return donser[i-k];
    }
};
View Code

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!