这里先讲一种类似于快速排序的方法。注意题目要求,不要求完全排序,只要求最快解决问题!这个题是我面试NI公司时,对方问我的。原话是从1亿个数据里,找出前一百个最大的。
首先看源码吧:
void main(int a[], int start, int end, int N)//从数组a里,找出前N个最大的。如果是a[100],则start = 0, end = 99.注意这个索 引问题
{
int mid = (start + end)/2;
int i = start, j = end;
while(i<j)
{
while(i<j && a[i]<=a[mid])
i++;
while(i<j && a[j]>=a[mid])
j--;
swap(a[i], a[j]);
}
/*注意这个while出来之后,i一定是等于j的,且从i 到 end是较大的那一端*/
if(end-i+1 == N)
return;
if(end - i+1 > N)
findMaxN(a, i, end, N);
else
findMaxN(a, start, i, N - (end -i +1));
}
再来详细说说思路,如果您看懂了快速排序对此一定不会陌
首先看源码吧:
void main(int a[], int start, int end, int N)//从数组a里,找出前N个最大的。如果是a[100],则start = 0, end = 99.注意这个索 引问题
{
int mid = (start + end)/2;
int i = start, j = end;
while(i<j)
{
while(i<j && a[i]<=a[mid])
i++;
while(i<j && a[j]>=a[mid])
j--;
swap(a[i], a[j]);
}
/*注意这个while出来之后,i一定是等于j的,且从i 到 end是较大的那一端*/
if(end-i+1 == N)
return;
if(end - i+1 > N)
findMaxN(a, i, end, N);
else
findMaxN(a, start, i, N - (end -i +1));
}
再来详细说说思路,如果您看懂了快速排序对此一定不会陌