既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
时间复杂度的计算
然后要遍历数据,最坏的情况是每个元素都与堆顶比较并排序,需要堆化n次
每次最差都下调高度次,而高度为log(k),所以是O(nlog(k))
因此总复杂度是O(k+nlog(k)),也就是O(nlogk)
代码的实现
#include<stdio.h>
#include<stdlib.h>
void swap(int\* a, int\* b)
{
int tem = \*a;
\*a = \*b;
\*b = tem;
}
void AdjustDown(int\* arr ,int n, int location) //在location位置向下调整
{
int child = location \* 2 + 1;
while (child < n)
{
if (child + 1 < n && arr[child] > arr[child + 1])
{
child++;
}
if (arr[child] < arr[location]) //小堆
{
swap(&arr[child], &arr[location]);
location = child;
child = location \* 2 + 1;
}
else
break;
}
}
int\* TopK(int\* arr, int k,int n)
{
int\* brr = (int\*)malloc(sizeof(int) \* k);
for (int i = 0; i < k; i++)//先建堆
{
brr[i] = arr[i];
}
for (int i = (k-2)/2; i >=0; i--)
{
AdjustDown(brr, k, i);
}
for (int i = k; i < n; i++)
{
if (arr[i] > brr[0])
{
brr[0] = arr[i];
AdjustDown(brr, k, 0);
}
}
return brr;
}
int main()
{
int arr[] = { 1,23,2,434,6,567,68,9 };
int n = sizeof(arr) / sizeof(int);
int k = 3;
int\* brr = TopK(arr, k,n);
for (int i = 0; i < k; i++)
{
printf("%d ", brr[i]);
}
return 0;
}
- 测试结果:
需要注意的是输出的结果并未排好序
只是按堆的形式排好了
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**