算法设计--查找无序数组中第K大的数字
2013-01-30 19:18
369 查看
给出一个数组,要求查找出这个数组中按顺序排第K大的数字。
思路:利用快速排序的思想,把数组中的元素分治,并计算中间值的位置,如果是K,则这个数就是第K大的数字,如果比K小,那么再次利用快速排序分治中值
以后的数据,如果比K大,则排序前面的数字,直到找到K的位置。
下面给出C++实现的代码:
思路:利用快速排序的思想,把数组中的元素分治,并计算中间值的位置,如果是K,则这个数就是第K大的数字,如果比K小,那么再次利用快速排序分治中值
以后的数据,如果比K大,则排序前面的数字,直到找到K的位置。
下面给出C++实现的代码:
#include <cstdlib> #include <iostream> using namespace std; int partition(int data[],int first,int last) //¿ìËÙÅÅÐòµÄ·Öλ { int pivot=data[first]; while(first<last) { while(first<last&&data[last]>pivot) last--; data[first]=data[last]; while(first<last&&data[first]<pivot) first++; data[last]=data[first]; } data[first]=pivot; return first; } int findKth(int data[],int first,int last,int k) { int kth; if(first==last) kth=data[first]; else { int pivot=data[first]; //Ïȸø¼Ç¼ÏÂÀ´ int splitPoint=partition(data,first,last); //ÕâÊÇÿһ´Î·Ö¸îµÄµãλ if(k<splitPoint) kth=findKth(data,first,splitPoint-1,k); else if(k>splitPoint) kth=findKth(data,splitPoint+1,last,k); else kth=pivot; } return kth; } int main(int argc, char *argv[]) { int a[11]={-1,11,17,18,5,7,14,9,6,27,21}; //ÕýÈ·µÄ˳ÐòÊÇ£º5,6,7,9,11,14,17,18,21,27 int t=findKth(a,1,10,6); cout<<t<<endl; system("PAUSE"); return EXIT_SUCCESS; }
相关文章推荐
- 算法设计--查找无序数组中第K大的数字
- 算法设计--查找无序数组中第K大的数字
- 算法之每日一题:找出无序数组中第k大的数字
- 数据结构——算法之(005)(输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字)
- 【算法】输入一个已经按升序排过的数组和数字,在数组中查找两个数字,使得它们的和正好是输入那个数字。
- 算法-数组-二维数字中的查找
- 求一无序数组中第n大的数字 - 快速选择算法
- PTA 求链式线性表的倒数第K项 给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字。
- 在无序数组中找第k大的数字—滴滴笔试
- 设计一个最优算法来查找n个元素数组中的最大值和最小值
- 二分——无序数组快速查找第K小的数
- 算法题练习(二)------哈夫曼树,比较奇数与偶数个数,查找一个数组的第K小的数
- 算法导论:快速找出无序数组中第k小的数
- 算法学习 - 查找第K大的数字
- 快速查找无序数组中的第K大数?
- 寻找单个无序数组中第K小的数字
- 每天学习一算法系列(14) (输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字)
- 查找整型数组里出现频率最高的数字的算法
- 在一个无序整型数组中找出第k小的数字
- 理解二分查找!!! 九度OJ-1534,数组中第K小的数字。