算法导论:快速找出无序数组中第k小的数
2015-03-29 14:34
253 查看
题目描述:
给定一个无序整数数组,返回这个数组中第k小的数。
解析:
最平常的思路是将数组排序,最快的排序是快排,然后返回已排序数组的第k个数,算法时间复杂度为O(nlogn),空间复杂度为O(1)。使用快排的思想,但是每次只对patition之后的数组的一半递归,这样可以将时间复杂度将为O(n)。
在《算法导论》有详细叙述 这里主要用C++实现,实现思路就是先选取当前数组的第一个数作为“主轴”,将后面所有数字分成两部分,前面一部分小于“主轴”,后面一部分大于“主轴”,然后计算前面一部分数字的有多少,如果大于K则递归--在前面一部分找第K个数,如果小于K则在后面一部分呢找,此时K要更新一下 K需要减去第一部分数字数目,递归查找。递归的细节自己掌握以下就行,思路基本就是这样。
代码实现:
执行结果:
给定一个无序整数数组,返回这个数组中第k小的数。
解析:
最平常的思路是将数组排序,最快的排序是快排,然后返回已排序数组的第k个数,算法时间复杂度为O(nlogn),空间复杂度为O(1)。使用快排的思想,但是每次只对patition之后的数组的一半递归,这样可以将时间复杂度将为O(n)。
在《算法导论》有详细叙述 这里主要用C++实现,实现思路就是先选取当前数组的第一个数作为“主轴”,将后面所有数字分成两部分,前面一部分小于“主轴”,后面一部分大于“主轴”,然后计算前面一部分数字的有多少,如果大于K则递归--在前面一部分找第K个数,如果小于K则在后面一部分呢找,此时K要更新一下 K需要减去第一部分数字数目,递归查找。递归的细节自己掌握以下就行,思路基本就是这样。
代码实现:
#include <iostream> #include <string> #include <cstring> #include <vector> #include <algorithm> using namespace std; /* 题目描述: 给定一个无序整数数组,返回这个数组中第k小的数。 实现思路: 就是先选取当前数组的第一个数作为“主轴”,将后面所有数字分成两部分,前面一部分小于“主轴”,后面一部分大于“主轴”,然后计算前面一部分数字的有多少,如果大于K则递归--在前面一部分找第K个数,如果小于K则在后面一部分呢找,此时K要更新一下 K需要减去第一部分数字数目,递归查找 */ void swap(int *p, int *q) { int t; t = *p; *p = *q; *q = t; } int findNumberK(vector<int> &vec, int k, int s, int e) // 快速排序(折半缩小递归区间的方法)查找 The K { int roll = vec[s], be = 0, j = s; for(int i = s+1 ; i<= e ; i++) { if(vec[i] < roll) { j++; swap(&vec[i], &vec[j]); be++; } } swap(&vec[s], &vec[j]); if(be == k - 1 ) return roll; else if (be < k - 1) { return findNumberK(vec, k - be - 1, j + 1, e); } else return findNumberK(vec, k, s, j - 1); } int main() { vector<int> a; int temp, k; cout << "input data:" << endl; cin >> temp; while(temp != 0) { a.push_back(temp); cin >> temp; } cout << "input K: " << endl; cin >> k; int number = findNumberK(a , k, 0 ,a.size() - 1); cout << "Test Result: " << number<< endl; /* The next use sort 模板快排进行结果验证 */ sort(a.begin(), a.end(), less<int>()); cout << "real Result: " << a[k-1] << endl; return 0; }
执行结果:
相关文章推荐
- 从一个数组中找出第k小元素的随机化算法 c语言实现 算法导论第九章
- 算法之每日一题:找出无序数组中第k大的数字
- 算法设计--查找无序数组中第K大的数字
- 面试题—— 找出一个无序整型数组中第k大的数。
- 算法设计--查找无序数组中第K大的数字
- 算法题(一)--找出数组中第k大的数并输出其下标(数组中的数有重复)
- 无序数组找出其中的第K大的数
- 【每天学点算法题10.18】找出数组中的第K大的数
- 经典算法题:无序整数数组中找第k大的数
- 经典算法学习——快速找出数组中两个数字,相加等于某特定值
- 找出无序数组中第k小的数
- 在一个无序整型数组中找出第k小的数字
- 快速查找无序数组中的第K大数?
- 二分——无序数组快速查找第K小的数
- 算法题:从数组找数字(网易2017校园招聘) 2017-10-10 算法爱好者 (点击上方公众号,可快速关注) 给定一个数组,除了一个数出现 1 次之外,其余数都出现 3 次。找出出现一次的数。
- 算法(三)找出数组中第K大元素
- 求一无序数组中第n大的数字 - 快速选择算法
- 算法设计--查找无序数组中第K大的数字
- 从一个数组中同时找出最大最小数-算法导论第九章
- java 实现从无序数组中 找出第k大的数, 无序数组充许有重复元素