码迷,mamicode.com
首页 > 编程语言 > 详细

算法复习:手推快排

时间:2020-01-29 23:21:46      阅读:74      评论:0      收藏:0      [点我收藏+]

标签:vector   href   code   --   pen   title   click   nbsp   位置   

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

 

算法复习:手推快排

标签:vector   href   code   --   pen   title   click   nbsp   位置   

原文地址:https://www.cnblogs.com/dzzy/p/12241585.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!