选择第K个最小元素

作为快速排序的扩展应用,这里介绍一个选择第k个最小元素的问题。

1. 问题描述

给定线性序列中的n个元素和一个整数k, 0<=k<n, 要求找出这n个元素中第k小元素。

2. 求解方法

2.1 直接排序

  使用quick sort, 然后选择第k个元素,需要的时间复杂度为O(n*logn).

 2.2 利用快速排序思想求解【分治法】

  在快速排序中我们用到partition方法每次可以找出中间元素,能够保证左边的元素都比它小,而右边的都比它大。所以可以利用这一点,让我们在O(n)的平均时间内找出第K个元素。

 1 int  partition(int int_array[], int low, int high)
 2 {
 3     int first = low, last = high;
 4     int key = int_array[first];
 5
 6     while(first < last)
 7     {
 8         while(first < last && int_array[last] >= key) --last;
 9         int_array[first] = int_array[last];
10         while(first < last && int_array[first] <= key) first++;
11         int_array[last] = int_array[first];
12     }
13     int_array[first] = key;
14     return first;
15 }
16
17 int select(int a[], int low, int high, int k)
18 {
19         int index = partition(a, low, high);
20         if(index == k)
21             return a[index];
22         else
23         {
24             if(k < index)
25                 select(a, low, index-1, k);
26             else
27                 select(a, index+1, high, k-index);
28         }
29 }
时间: 2024-08-24 11:20:00

选择第K个最小元素的相关文章

查找数列中第K小的元素(C语言版)

今天在看<算法:C语言实现>时,在快速排序那一章最后一节讲述了利用快速排序的思想,快速排序每次划分后在枢轴的左边的元素都比枢轴小,在枢轴右边的数都比枢轴大(或相等),而划分后枢轴本身就放在了(有序时)它自身应该在的位置,在每次划分后判断枢轴下标和k的大小就可以快速找出数列中第k小的数了. 看完之后,我想既然利用快速排序的思想可以很快的找到第k小的数,那么能不能利用计数排序的思想来查找第k小的数呢,仔细一想,完全可以!计数排序是利用一个计数数组C来记录待排序数组中各个不同数值出现的次数,然后通过

A题之找K个最小的数

剑指offer上的一道题:输入n个整数,找出最小的k个数.例如输入4.5.1.6.2.7.3.8共8个数,最小的4个数为:1.2.3.4. 分析: 解法一: 可以把它看车数组排序问题,先对数组排序,再取数组前k个数.各个排序算法中,快排是性价比比较高的了,时间事件复杂度为O(n*logn).还有没有其他解法呢? 解法二: 快排思想派上用场了.快排算法中,我们通常要找一个参考元素,针对这个元素把数组分为俩个子数组.元素左边的子数组小于该元素,元素右边的子数组小于该元素.对了!只要找到一个元素使得他

LeetCode OJ:Kth Smallest Element in a BST(二叉树中第k个最小的元素)

Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. Note: You may assume k is always valid, 1 ≤ k ≤ BST's total elements. 求二叉树中第k个最小的元素,中序遍历就可以了,具体代码和另一个Binary Tree Iterator差不多其实,这题由于把=写成了==调bug调了好久,细心细心啊啊

[算法]请用A中元素组成一个大于k的最小正整数

给定A[]={0,1,3,8},A是U={0,1,2,3,4,5,6,7,8,9}的子集,k是正整数,请用A中的元素组成一个大于k的最小正整数. 思路: 1.使用flag数组标记A中的元素, bool flag[10]; 顺便记录A中的最小元素 bool flag[10] = {0,0,0,0,0,0,0,0,0,0}; int min = 10; for(int i = 0; i < n; ++i){ flag[a[i]] = true; min = min < a[i] ? min : a

数组中第K大的元素

数组中第K大的元素总结 解法1: 我们可以对这个乱序数组按照从大到小先行排序,然后取出前k大,总的时间复杂度为O(n*logn + k). 解法2: 如果k很小,比如第五个最大的数,而整个数组的长度非常的大,那么,还有一种方法就是,我做k遍找最大的数,每做一遍,就把最大的放在数组的最后面(遍历一次找出最大的数例如冒泡,选择排序都可以.),然后减少数组扫描的范围,就可以把第k大的数找出来,这样做的复杂度就是O(K*N),在K很小的情况下,还是不错的. 解法3: 利用快速排序的思想,从数组S中随机找

现在有m组n个有序数组,例如{1,2,3,4},{2,3,4,6},{1,3,5,7},在这些数组中选择第k小的数据,然后返回这个值

问题描述:现在有m组n个有序数组,例如{1,2,3,4},{2,3,4,6},{1,3,5,7},在这些数组中选择第k小的数据,然后返回这个值 思路:参照两个数组归并的过程,每次选取最小的数据进行比较 1,定义选取位置数组index[m],初始化为0 2,每次根据index[m]寻找到第l_row个数组,确保当前时刻的第l_row数组的当前位置为最小值:寻找时确保index[i]的值小于n 3,把最小值取出,index[l_row]自增1 4,逐次寻找,知道找到第k个为止 1 public st

[LeetCode] Kth Smallest Element in a Sorted Matrix 有序矩阵中第K小的元素

Given a n x n matrix where each of the rows and columns are sorted in ascending order, find the kth smallest element in the matrix. Note that it is the kth smallest element in the sorted order, not the kth distinct element. Example: matrix = [ [ 1, 5

寻找数组中的第K大的元素,多种解法以及分析

遇到了一个很简单而有意思的问题,可以看出不同的算法策略对这个问题求解的优化过程.问题:寻找数组中的第K大的元素. 最简单的想法是直接进行排序,算法复杂度是O(N*logN).这么做很明显比较低效率,因为不要求别的信息只要计算出第K大的元素.当然,如果在某种情况下需要频繁访问第K大的元素就可以先进行一次排序在直接得出结果. 第一种方式是这样,用选择排序,冒泡法,或者交换排序这类的排序,对前K个元素进行排序.这三种算法也许不是最快的排序算法.但是都有个性质:计算出最大(小)的元素的算法复杂度是O(N

实现栈最小元素的min函数

1 #include<iostream> 2 #include<stack> 3 using namespace std; 4 class min_stack 5 { 6 public: 7 void push(int); 8 void pop(); 9 int min(); 10 int size() 11 { 12 return data.size(); 13 } 14 private: 15 stack<int> data; 16 stack<int>