面试题:算法题
10万次搜索,两两比较找出top100,然后比较次数总次数不超过20万次,不能碎片化申请空间,一次性申请一个大数组作为储存。
下午:索贝科技有限公司
#include <iostream>
using namespace std;
// 构建大根堆,其中a是第一个非叶子节点,z是节点个数
void HeapAdjust(int A[], int a, int z)
{
// 重建最大堆,i是父节点,j是左子节点
for(int i = a, j = 2 * i; j <= z; i = j, j = 2 * i)
{
// 取i的左右子节点中较大的子节点
if(j < z && A[j + 1] > A[j])
j++;
if(A[i] < A[j])
swap(A[i], A[j]);
else
break;
}
}
// 从右到做,从下到上
void HeapSort(int A[], int n)
{
// 第一步:建立大根堆(i是第一个非叶子节点,n是节点个数)
for(int i = n / 2; i >= 1; i--)
{
HeapAdjust(A, i, n);
}
for(int i = n; i >= 1; i--)
{
// 第二步:交换堆元素(堆首和堆尾)
swap(A[1], A[i]);
// 第三步:重建大根堆
HeapAdjust(A, 1, i - 1);
}
}
void TopK(int n,int top)
{
int * arr = (int *)malloc(sizeof(arr)*n);
if(arr==NULL)
{
return ;
}
for(int i = 1; i <=n; i++)
{
arr[i] = rand();
}
HeapSort(arr, n);
for(int i = 1;i<=top;i++)
{
cout<<arr[i]<<endl;
}
if(arr!=NULL)
{
arr=NULL;
free(arr);
}
}
int main()
{
TopK(10000,30);
system("pause");
return 0;
}