找出N个无序数中第K大的数
使用类似快速排序,执行一次快速排序后,每次只选择一部分继续执行快速排序,直到找到第K个大元素为止,此时这个元素在数组位置后面的元素即所求
时间复杂度:
1、若随机选取枢纽,线性期望时间O(N)
2、若选取数组的“中位数的中位数”作为枢纽,最坏情况下的时间复杂度O(N)
利用快速排序的思想,从数组S中随机找出一个元素X,把数组分为两部分Sa和Sb。Sa中的元素大于等于X,Sb中元素小于X。这时有两种情况:
- #include<stdio.h>
- #include<time.h>
- #include<stdlib.h>
- #define N 10
- int Partition(int *array, int low, int high) {
- int temp = array[low];
- while (low != high) {
- while (low<high && array[high]>=temp) high--;
- array[low] = array[high];
- while (low<high && array[low]<=temp) low++;
- array[high] = array[low];
- }
- array[low] = temp;
- return low;
- }
- void findk(int k, int *array, int low, int high) {
- int pos;
- pos = Partition(array, low, high);
- if (pos == k - ) printf("第%d大的数是%d\n", k, array[k - ]);
- else if (pos > k - ) { //左边堆元素个数Sa大于k,则在左边堆中找第k大的数
- findk(k, array, low, pos - );
- }
- else { //左边堆元素个数Sa小于k,则在右边堆中找第 k -Sa个元素
- findk(k - pos, array, pos + , high);
- }
- }
- void printArray(int *a) {
- for (int i = ;i < N;++i) {
- printf("%3d", a[i]);
- }
- printf("\n");
- }
- int main() {
- int *a = (int*)calloc(N, sizeof(int));
- srand(time(NULL));
- for (int i = ;i < N;++i) {
- a[i] = rand() % ;
- }
- printArray(a);
- findk(, a, , N - );
- return ;
- }
找出N个无序数中第K大的数的更多相关文章
- 寻找数列中第k大的数算法分析
问题描述:给定一系列数{a1,a2,...,an},这些数无序的,现在求第k大的数. 看到这个问题,首先想到的是先排序,然后直接输出第k大的数,于是得到啦基于排序的算法 算法一: #include&l ...
- [经典算法题]寻找数组中第K大的数的方法总结
[经典算法题]寻找数组中第K大的数的方法总结 责任编辑:admin 日期:2012-11-26 字体:[大 中 小] 打印复制链接我要评论 今天看算法分析是,看到一个这样的问题,就是在一堆数据 ...
- 查找数组中第k大的数
问题: 查找出一给定数组中第k大的数.例如[3,2,7,1,8,9,6,5,4],第1大的数是9,第2大的数是8-- 思考:1. 直接从大到小排序,排好序后,第k大的数就是arr[k-1]. 2. ...
- 求数列中第K大的数
原创 利用到快速排序的思想,快速排序思想:https://www.cnblogs.com/chiweiming/p/9188984.html array代表存放数列的数组,K代表第K大的数,mid代表 ...
- 找出整数中第k大的数
一 问题描述: 找出 m 个整数中第 k(0<k<m+1)大的整数. 二 举例: 假设有 12 个整数:data[1, 4, -1, -4, 9, 8, 0, 3, -8, 11, 2 ...
- 乱序数组中第k大的数(顺序统计量)
该问题是顺序统计量中十分经典的问题. 使用快排中的分区法,将第k大的数排序.若双向扫描分区加上三点中值法或绝对中值法,可以保证在 O(n) 时间里找出第k大的数. 补充:可以直接使用C++STL中的n ...
- 寻找数组中第K大的数
给定一个数组A,要求找到数组A中第K大的数字.对于这个问题,解决方案有不少,此处我只给出三种: 方法1: 对数组A进行排序,然后遍历一遍就可以找到第K大的数字.该方法的时间复杂度为O(N*logN) ...
- 查找无序数组中第K大的数
思路: 利用快速排序的划分思想 可以找出前k大数,然后不断划分 直到找到第K大元素 代码: #include <iostream> #include <algorithm> # ...
- 找轮转后的有序数组中第K小的数
我们可以通过二分查找法,在log(n)的时间内找到最小数的在数组中的位置,然后通过偏移来快速定位任意第K个数. 此处假设数组中没有相同的数,原排列顺序是递增排列. 在轮转后的有序数组中查找最小数的算法 ...
随机推荐
- 【idea】清除类中无用的包
快捷键 ctrl+alt+o 自动清除的配置方法 可以settings-general-auto import-java项,勾选optimize imports on the fly,在当前项目下会自 ...
- day12Flume、azkaban、sqoop
1.PS:Hive中好少有update这个方法,因为他主要是用来批量数据的处理分析. 2.PS:软连接和硬连接的区别 软连接就是我们普通和Windows系统一样的快捷方式,她也是一个文件 硬连接就是他 ...
- 使用patroni 构建高可用的pg 数据库
patroni 是一个基于zk.etcd .consul 等的pg ha 模版,我们可以使用这个工具,快速的搭建一套 pg 的高可用方案 环境准备 mac 操作系统 安装基础差组件 brew inst ...
- node ->rman to RAC (迁移)
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/lmocm/article/details/34435699 *.audit_file_dest='/ ...
- java System.arraycopy()
package study.stage2; import java.util.Arrays; /** * Created by Sandy.Liu on 2017/7/19. */public cla ...
- Android 开发 技术大纲
大家好, 下面 是 Android 开发 的 技术大纲, 觉得 画的很好, 所以 转载过来, 这个 技术大纲 出自 “享学课堂” .
- apache HTML5 History 模式 配置
说明 使用的 Apache/2.4.6 版本. 文档这么写的: 但是 没说 IfModule 放在哪里 . httpd.conf 里面有大量的 IfModule . 这样的.但是实测 无效.无 ...
- C# 虚方法、override和new
使用new关键字来做调用 using System; using System.Collections.Generic; using System.Linq; using System.Text; u ...
- sql update操作结果
Mysql 在MySQL中只有真正对记录进行修改了的情况下,row_count才会去记录影响的行数,否则如果记录存在但是没有实际修改则不会将该次更新记录到row_count中. update操作执行结 ...
- RedHat7局域网下安装离线Ambari
1 Ambari介绍.安装与应用案例介绍 1.1 Ambari Ambari 跟 Hadoop 等开源软件一样,也是 Apache Software Foundation 中的一个项目,并且是顶级项目 ...