TOP k演算法
阿新 • • 發佈:2018-12-09
面試題:演算法題 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;
}