线性时间找第k小
来源:互联网 发布:js push 数组对象 编辑:程序博客网 时间:2024/05/24 00:13
一个parition函数,就是快排里边的划分函数,思路就是找到一个枢轴元素,把小于等于它的放在它左边,大于它的放在右边,然后返回这个枢轴元素的位置下标。
一个q_select函数,用来找第k小。基本思路就是先用partition划分一次,划分成两部分,如果k小于等于左半部分的数的个数,就在左边找第k小,如果大于左半部分个数,就在右边找第(k-左半部分个数)。
这里注意的问题就是有重复元素。由于最终可能不会出现只剩一个元素的情况(剩下了一堆相等的数),所以当左右边界相等的时候,说明这一段数字都是相等的,也可直接返回。
#include <stdio.h>#include <iostream>#include <algorithm>#include <stdlib.h>using namespace std;int partition(int a[], int l, int r){int x = a[l];int i = l, j = r+1;while(1){while(a[++i] <= x && i < r);//一定是小于等于 (有重复元素都放在左边) while(a[--j] > x);if(i >= j) break;swap(a[i], a[j]);}a[l] = a[j];a[j] = x;return j;}int q_select(int a[], int l, int r, int k){if(l == r || a[l] == a[r])//当把所有相等元素归在一起时,若边界值相等,则说明这一段数据都是相等的 return a[l];int i = partition(a, l, r);int j = i - l + 1;if(k <= j) return q_select(a, l, i, k);else return q_select(a, i+1, r, k-j);}int main(){int n, i, a[100005], k;scanf("%d", &n);for(i = 0 ; i < n ; i++){scanf("%d", &a[i]);}scanf("%d", &k);printf("%d\n", q_select(a, 0, n-1, k));return 0;}
0 0
- 线性时间找第k小
- 线性时间找第K小的数
- O(n)线性时间找第K大,中位数
- java线性时间寻找第k小元素
- 线性时间选择第k小(递归)
- 线性时间求第k小(分治思想)
- 线性时间选择第K小元素(随机化选择第K小元素)C++
- HDU6040-Hints_of_sd0061-STL/快排思想/线性时间找第k大
- HDU-6040 Hints of sd0061(线性找第k小)
- HDU-6040 Hints of sd0061(线性找第k小)
- 找第j小元素(最坏情况为线性时间)
- 【模拟】找第k小的数
- 找第k小的数
- 线性时间查找第k大元素
- 在线性时间复杂度内求解第k小元素问题
- 递归与分治策略-2.9.1线性时间选择(随机划分基准)(第k小问题)
- 算法导论学习之线性时间求第k小元素+堆思想求前k大元素
- 分治算法;随机化划分函数;快速排序;线性时间选择第K小元素;快速排序平均时间复杂度nlgn;
- linux网络编程之socket(十一):套接字I/O超时设置方法和用select实现超时
- 使用手势输入数字
- TCP通信流程解析
- object-c 新旧两种弹出框
- UItableView的headview视图有空白
- 线性时间找第k小
- HTML-嵌入
- 4.接收事件推送
- hdu 2552 三足鼎立
- C语言函数指针与指针函数
- LeetCode:Longest Common Prefix
- LeetCode208. Implement Trie (Prefix Tree)实现前缀树
- C# lock关键字 同步代码块
- orm2 中文文档 6. 查找记录