寻找第K小元素O(N)算法
2012-03-16 21:22
190 查看
快速排序时间复杂度:O(n*lgn)
但是没必要完整排序后再O(1)选出第k元素。
思想:利用快排分区思想,分界点为q,左边的数小于等于q,右边的数大于q这个规则。如果k小于左边区间个数则以左区间递归,否则在右区间递归。
但是没必要完整排序后再O(1)选出第k元素。
思想:利用快排分区思想,分界点为q,左边的数小于等于q,右边的数大于q这个规则。如果k小于左边区间个数则以左区间递归,否则在右区间递归。
#include <stdio.h> #define MAX 100000 void swap(int *a, int *b){/*交换*/ int temp; temp = *a; *a = *b; *b = temp; } int quicksort(int a[], int s, int e){ int i; int l = s, r = e; for(i = s; i< e;i++){ /*所有比a[e]小的元素都排前面*/ if(a[i] < a[e]) swap(&a[l++], &a[i]); } swap(&a[l], &a[e]);/*所有比a[e]大的排其后面*/ return l; /*找到区间中大于和小于最末元素的分界*/ } int selectMinK(int a[], int s, int e, int k){ if(s == e) return a[s]; int q = quicksort(a, s, e); int num = q-s+1;/*计算左边区间元素个数*/ if(num == k) return a[q]; if(num > k) return selectMinK(a, s, q-1, k);/*递归搜索左边区间*/ else return selectMinK(a, q+1, e, k-num);/*递归搜索右区间*/ } int main(){ int a[MAX], n, k, ret, i; scanf("%d",&n); for(i =0 ;i < n; i++){ scanf("%d",&a[i]); } scanf("%d",&k); ret = selectMinK(a, 0, n-1 ,k); printf("%d\n", ret); return 0; }
相关文章推荐
- 【算法剖析】寻找两个已序数组中的第k大元素
- 寻找第K元素的八大算法、源码及拓展
- 算法:寻找第K小元素
- 减治算法之寻找第K小元素问题
- Hoare选择算法 寻找第k小元素C实现 算法的“AWK脚手架和grap运行过程分析”
- 在数组A中寻找第k小的元素-最坏情况为线性时间的算法
- 寻找第K大元素的八大算法、源码及拓展
- 寻找数组中的第k小的元素
- 算法代码实现之选出第k小元素、中位数、最小的k个元素(线性复杂度),C/C++实现
- [LeetCode题解]从两个有序数组的并集中寻找第k小元素
- Go语言算法之寻找数组第二大元素的方法
- 寻找数组中第k小元素
- 从两个有序数组的并集中寻找第k小元素
- 【算法31】寻找数组的主元素(Majority Element)
- 寻找第K小元素
- lintcode&九章算法——lintcode NO.5 第k大元素 ? 带解决
- 算法笔记04--分治法之寻找最大最小元素
- 第k元素log(n)算法--划分树
- 【算法-快速排序】第k大元素(Kth Largest Element)
- 算法代码实现之选出第k小元素、中位数、最小的k个元素(线性复杂度),Golang(Go语言)实现