查找一个无序数列中第k个大的元素

来源:互联网 发布:阿里云域名必须备案吗 编辑:程序博客网 时间:2024/05/03 21:01

       今天面试面试官出了一道题:给你一个 无序int数组,让你查找出第K个大的元素(0<k<n)。小生惭愧当时没有想到一个好点的方法,现如今有一个方法可以解决此题。

       现如今代码如下:(C++)
#include <iostream>using namespace std;int FindNum(int *a, int left, int right, int k){ //以快速排序的思想解决此题。因为一趟快速排序可以找到一个元素最终的位置。 int low = left; int high = right; int temp = a[low]; int flag = 0;//标记若为0表示high指针往low端滑动,若为1表示low指针往high端滑动。 while (low < high) {  if (0 == flag)//high指针往low端滑动  {   if (a[high] > temp)   {    high--;   }   else   {    a[low++] = a[high];    flag = 1;//修改标记已指示下次滑动方向   }  }  else  {   if (a[low] < temp)   {    low++;   }   else   {    a[high--] = a[low];    flag = 0;//修改标记已指示下次滑动方向   }  } } //一趟快速排序结束,则找出了temp元素所对应的位置low,如果k==low则,temp为第k个大的元素。 //如果K>low则进行递归调用FindNum(a, low+1, right, k). //如果K<low则递归调用FindNum(a, left, low-1, k). if (k == low) {  return temp; } else if (k > low) {  return FindNum(a, low+1, right, k); } else {  return FindNum(a, left, low-1, k); }}int main(void){ int a[10] = {9, 4, 8, 2, 6, 1, 0, 3, 7, 5}; cout<<FindNum(a, 0, 9, 3)<<endl; return 0;}

     

原创粉丝点击