首页 > 其他分享 >选取TOP K的问题之快速排序

选取TOP K的问题之快速排序

时间:2023-02-12 19:46:45浏览次数:45  
标签:arr return int quicksort TOP 哨兵 选取 数组 排序

方法1:快速排序:

  1. 哨兵划分:选取一个哨兵,将大于哨兵的移到哨兵右侧;小于哨兵的移到哨兵左侧。
  2. 递归操作:递归的将左右子数组进行哨兵划分,直至区间长度为1,完成递归。
  3. 快排完成后将数组前k个值输出
    void quicksort(vector<int>&arr,int l,int r){
        if(r<=1) return;
        int i = l;int j = r;
        while(i<j){
            while(i<j && arr[j] >= arr[l]) --j;
            while(i<j && arr[i] <= arr[l]) ++i;
            swap(arr[i],arr[j]); 
        }
        swap(arr[l],arr[i]);
        quicksort(arr,l,i-1);
        quicksort(arr,i+1,r);
    }

l和r是数组的左右边界;

时间复杂度:O(Nlog N); 空间复杂度:O(log N)最好;O(N)最坏

方法2:基于快速排序的数组划分

核心思想:因为返回的值不要求排序,只需要找出最小的前k个值就行。所以不再对左右两个子数组都进行递归操作,而是根据 k的值 与每次递归之后的 i值进行比较,若大于i,则说明前 第 k+1 个最小值在右子数组,小于i,则说明 第k+1个最小值在左子数组,若相等,则说明是 arr[k]即为第k+1个最小值,直接返回前k个值。

class{
public:
    vector<int> getLeastNumbers(vector<int>&arr,int k){
        if(k>=arr.size()) return arr;
        return quicksort(arr,k,0,arr.size()-1);
    }
private:
    vector<int> quicksort(vector<int>& arr,int k,int l ,int r){
        int i = l, j = r;
        while(i<j){
            while(i<j && arr[j] >= arr[l]) --j;
            while(i<j && arr[i] <= arr[l]) ++i;
            swap(arr[i],arr[j]);
        }
        swap(arr[i],arr[l]);
        if(k > i) return quicksort(arr,k,i+1,r);
        if(k < i) return quicksort(arr,k,l,i-1);
        vector<int>v;
        v.assign(arr.begin(),arr.begin()+k);
        return v;
    }
};

 时间复杂度:等比数列求和,O(N); 空间复杂度:O(log N)。

标签:arr,return,int,quicksort,TOP,哨兵,选取,数组,排序
From: https://www.cnblogs.com/xuan01/p/17114520.html

相关文章

  • SpringBoot+ElasticSearch 实现模糊查询,批量CRUD,排序,分页,高亮!
    一、导入elasticsearch依赖在pom.xml里加入如下依赖<dependency>      <groupId>org.springframework.boot</groupId>      <artifactId>spring-boot-starte......
  • ubuntu 安装 github desktop
    原文:https://gist.github.com/berkorbay/6feda478a00b0432d13f1fc0a50467f1sudowgethttps://github.com/shiftkey/desktop/releases/download/release-3.1.1-linux1/Gi......
  • 微软远程桌面Remote Desktop for Mac正式版
    哪里可以下载RemoteDesktop中文破解版资源呢?为大家带来微软远程桌面RemoteDesktopforMac正式版,microsoftremotedesktopmac版是一款运行在Mac平台上的微软远程桌面连......
  • 七大排序算法
    冒选插桶快归堆,以下均为升序1冒泡排序描述:比较相邻的元素。如果第一个比第二个大,就交换它们两个;对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样......
  • C语言:任意10个浮点数从小到大排序
    //冒泡排序:将任意10个浮点数从小到大排序#include<stdio.h>main(){floata[10],t;inti,j,k,b;for(i=0;i<=9;i++)scanf("%f",&a[i]);for(......
  • 手把手教你Parallels Desktop最佳化设置,让Windows更加好用!
    原文来源于黑果魏叔官网,转载需注明出处。图文教程:1、我们右键Dock栏的ParallelsDesktop图标(简称PD图标),选择偏好设置  2、点通用选项卡,把在菜单栏中显示Parallels图标的勾......
  • 《基础数据结构-排序》之交换排序
    PS:要转载请注明出处,本人版权所有。PS:这个只是基于《我自己》的理解,如果和你的原则及想法相冲突,请谅解,勿喷。前置说明  本文作为本人csdnblog的主站的备份。(BlogID......
  • 冒泡排序
    正文:此题吾用的是冒泡排序,只有两个方面:排序再去重排序:每个数比较后一个数,如果大就交换位置;去重:有一个变量f,f依次等于每一个数组值(初始为第一个数,从第二个开始......
  • Mybatis plus按照时间排序后分页查询有重复情况
    场景有一个根据create_time排序的分页接口,在第二页会出现第一页出现过的重复记录排查思路排查1、入参处理时对分页相关数据的处理有问题排查2、sql的入参数有问题经......
  • #yyds干货盘点#分析一下Linux 的top 命令
    ​​top​​ 命令是一个系统监测工具,它显示了当前系统中最消耗资源的进程,帮助系统管理员快速了解系统的运行情况和性能瓶颈。它在Linux操作系统中是一个非常常用的命令。......