算法学习 - 查找第K大的数字
2015-10-24 20:53
344 查看
寻找第K大的数字
一般我们会找最大的数字和最小的数字,然而时间都是O(N)级别的。这里第K大的数字查找方法其实很简单,就是每次把数组分成两部分,然后看第K大的数字属于哪个组,就查找这个组,扔另一组。
这个方法更像快速排序,因为快速排序的时间复杂度是O(NlogN),而这个方法因为不需要对抛弃的一半进行操作,所以这个方法要比NlogN的方法要更快一点,平均复杂度接近O(n)。
代码如下:
// // main.cpp // Find_K_Max_Number // // Created by Alps on 15/10/23. // Copyright (c) 2015年 chen. All rights reserved. // #include <iostream> #include <vector> #include <time.h> using namespace std; int RandNum(int start, int end); void SwapArr(int &a, int &b){ a = a+b; b = a-b; a = a-b; } int FindNum(int start, int end, int * arr, int k){ if (end <= start) { return arr[end]; } int cur = RandNum(start, end); SwapArr(arr[cur], arr[end]); int i = start, j = start; for (i = start; i < end; ++i) { if (arr[i] < arr[end]) { SwapArr(arr[i], arr[j]); j++; } } SwapArr(arr[j], arr[end]); if (j == k-1) { return arr[j]; }else if (j > k-1) { return FindNum(start, j-1, arr, k); }else { return FindNum(j+1, end, arr, k); } } int RandNum(int start, int end){ if ((end-start) == 0 || end < start) { return 0; } srand((unsigned)time(NULL)); int TEMP_RAND_NUM = rand()%(end-start) + start; return TEMP_RAND_NUM; } int FindKMax(int * arr, int length, int k){ return FindNum(0, length-1, arr, k); return 0; } int main(int argc, const char * argv[]) { int a[5] = {4,2,1,3,5}; printf("%d\n",FindKMax(a, 5, 3)); return 0; }
以上代码我测试过了。暂时没有发现问题。
相关文章推荐
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析
- C#获取关键字附近文字算法实例