今天面试面试官出了一道题:给你一个 无序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;
}
#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;
}