题目描述

给定一个未排序的整数数组,找到其中第k大的数
样例:

  • 给出数组[4,5,1,2,3]和k=3,返回3;
  • 给出数组[7,9,4,5]和k=1,返回9.
    要求时间复杂度为O(n),空间复杂度为O(1)
分析

快排–不用完全快排完成:

因为快排每次将数组划分为两组加一个枢纽元素,每一趟划分你只需要将k与枢纽元素的下标进行比较,如果比枢纽元素下标大就从右边的子数组中找,如果比枢纽元素下标小从左边的子数组中找,如果一样则就是枢纽元素,找到,如果需要从左边或者右边的子数组中再查找的话,只需要递归一边查找即可,无需像快排一样两边都需要递归,所以复杂度必然降低。

最差情况如下:假设快排每次都平均划分,但是都不在枢纽元素上找到第k大

第一趟快排没找到,时间复杂度为O(n),第二趟也没找到,时间复杂度为O(n/2),。。。。。,第k趟找到,时间复杂度为O(n/2k),所以总的时间复杂度为O(n(1+1/2+….+1/2k))=O(n),明显比冒泡快,虽然递归深度是一样的,但是每一趟时间复杂度降低。

代码实现

快排求第k大数代码如下:

#include <stdio.h>#define length(array) sizeof(array)/sizeof(array[0])
#define true 1
#define false 0int Sort(int *a, int low, int high)
{int pivot = a[low]; //这里每次的枢纽元素都取了待排数组的第一个元素,记住是a[low],而不是a[0]if(low < high)  //时间复杂度是O(n),n是数组长度{while(a[high] >= pivot && low < high)high --;a[low++] = a[high];while(a[low] <= pivot && low <high)low ++;a[high--] = a[low];}a[low] = pivot;return low;
}
int QuickSort_K_MAX(int *a, int low, int high, int k)
{if(low >= high)return a[low];else{int mid = Sort(a,low,high); //划分子递归数组if(mid > k)QuickSort_K_MAX(a,low,mid-1,k); //左递归else if(mid < k)QuickSort_K_MAX(a,mid+1,high,k); //右递归,一旦右递归mid+1=high,将退化成冒泡,递归深度将变成n,n为数组长度elsereturn a[mid];}
}
int main()
{int a[10] = {10,7,8,6,3,1,5,2,4,9};int k =6;int len = length(a);printf("%d",QuickSort_K_MAX(a,0,len-1,len-k));return 0;
}

Leetcode-215:求一个数组中第k大的数相关推荐

  1. 算法12--topK求一个数组中第k大的数

    求一个数组中第k大的值 解法一: 建立一个k个元素的最大堆,首先将数组中前k个元素放入堆中,此时堆顶元素为第k大的元素,后面继续遍历数组,比较堆顶元素与数组中元素值,当数组中元素小于堆顶元素时,将堆顶 ...

  2. C语言求一个数组中第k大的数,leetcode | Median of Two Sorted Arrays 寻找2个有序数组中第k大的值...

    There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted ...

  3. 求无序数组中第k大的数

    如果是排好序的数组,则比较简单,直接$arr[$k-1]就能求出,如果不是排好序的就需要先排序,但这种时间复杂度为O(n2),所以不能直接排序.我们知道快速排序就是找一个哨兵,使左边的数比它大,右边的 ...

  4. 求无序数组的第K(大/小)数的三种方法

    题目描述:给定一个无序数组(长度为n)和一个正整数 K,让你求此数组中第K大的数 方法1:最简单的思路,你肯定会想到 先把数组排序,然后再取下标为K的对应数组元素.这种方法肯定是可行的,但是这种方法无 ...

  5. Leetcode215数组中第k大的数-最小堆

    题目 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出 ...

  6. 寻找数组中第k大的数

    题目:有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在. 测试样例: [1,3,5,2 ...

  7. java查找第k大的数字_查找数组中第k大的数

    问题:  查找出一给定数组中第k大的数.例如[3,2,7,1,8,9,6,5,4],第1大的数是9,第2大的数是8-- 思考:1. 直接从大到小排序,排好序后,第k大的数就是arr[k-1]. 2. ...

  8. 找出数组中第k大的数

    给定一个数组,找出数组中第k大的数.其实现代码如下: package com.threeTop.www;/*** 找出数组中第k大的数* @author wjgs**/ public class Fi ...

  9. Java找出数组中第K大的数

    题目描述 有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在. 测试样例: [1,3,5 ...

最新文章

  1. 语文教学中如何运用计算机辅助教学,计算机辅助教学在语文教学过程中的运用...
  2. Spring - Java/J2EE Application Framework 应用框架 第 18 章 使用Quartz或Timer完成时序调度工作
  3. mysql 数据趋势,2019年8月全球数据库流行度排行--oracle、mysql增长趋势明显
  4. [蓝桥杯2015决赛]五星填数-枚举+数论
  5. 前端学习(540):node.js简介
  6. [秘技]解决QQ音乐超出服务区域问题
  7. 论文笔记 - 《Deep Learning》(Yann LeCun Yoshua Bengio Geoffrey Hinton) 精典
  8. 计算机python指什么_python之浅谈计算机基础
  9. mysql 数据库基础教程(一)
  10. JAVA Swing主题 简洁扁平化苹果风格主题
  11. 火影忍者之~静音 (优先队列)
  12. K近邻模型、KNN算法1-构建预测模型
  13. 【第3版emWin教程】第8章 emWin6.x的带OS方式移植(STM32H7之RGB接口)
  14. 在excel中使用插值法补全数据
  15. 四极管 整理wince挂起和唤醒(suspend/wakeup)以及实现关机功能文章
  16. 复习电商笔记-21-linux版主从复制
  17. Webview加载本地图片的方案对比
  18. 打包项目的时候报错:Failed to execute goal on project ...: Could not resolve dependencies for project ...
  19. 如何保证云docker容器重启后数据不丢失
  20. windows使用教程大全

热门文章

  1. 微信小程序:用户微信登录流程(附:流程图+源码)
  2. 计算机专业英语第六单元,计算机专业英语 (六)(示例代码)
  3. 思科路由器ipsec lan-to-lan综合案例详解
  4. 常见的几种内排序算法以及实现(C语言)
  5. 邓白氏编码(duns number)申请以及填写方法-苹果开发者申请必用
  6. vijos 1404 遭遇战[spfa]
  7. 迭代法求平方根C语言版(1021)
  8. 计算机混合地址相对地址绝对地址,引用的分类及讲解
  9. 【技术分享】昇腾CANN AIPP入门学习实战总结
  10. X ? X :X ;出错