算法复习:手推快排

Posted dzzy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法复习:手推快排相关的知识,希望对你有一定的参考价值。

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

 

以上是关于算法复习:手推快排的主要内容,如果未能解决你的问题,请参考以下文章

2023数据结构考研复习-排序

2023数据结构考研复习-排序

2019秋招复习笔试--手写代码

算法--排序--分治与快速排序

OI算法复习

排序---内部排序算法(快排希尔排序归并排序基数排序冒泡选择排序)比较