🖊作者 : D. Star.
📘专栏 : 数据结构
😆今日分享 : “人类之所以伟大,是因为能想象出未来,并创造出自己的未来。” - 奥加·曼
该句话表达了人类作为智慧生命的独特能力,即通过想象和创造,使得人类得以不断超越现有的局限,开拓未来的可能性。
文章目录
🌻建堆算法(向下调整最优)
//向下调整--建堆--O(n)
void HPCreate(HP* hp, HeapDataType* a, int n)
{
assert(hp);
//开辟空间
hp->a = (HeapDataType*)malloc(sizeof(HeapDataType) * n);
if (hp->a == NULL)
{
perror("malloc fail");
exit(-1);
}
//将数组的内容复制到结构体的数组中
memcpy(hp->a, a, sizeof(HeapDataType) * n);
hp->size = hp->capacity = n;
//建堆算法
for (int i = (n - 1 - 1) / 2; i >= 0; --i)
{
AdjustDown(hp->a, n, i);//向下调整更优O(n);
}
//升序--大堆
//降序--小堆
int end = n - 1;
while (end > 0)
{
HPSwap(&a[0], &a[end]);
AdjustDown(a, end, 0);
--end;
}
}
🌻堆排序
//堆排序--O( n*log(n) )
//思想:先建堆,再排序
void HeapSort(HeapDataType* a, int n)
{
//建堆算法
for (int i = (n - 1 - 1) / 2; i >= 0; --i)
{
AdjustDown(a, n, i);//向下调整更优O(n);
}
//升序--大堆
int end = n - 1;
while (end > 0)
{
HPSwap(&a[0], &a[end]);
AdjustDown(a, end, 0);
--end;
}
}
🌻找n个数字中的k个最大值(文件版)
#define k 5
void test07()
{
// 造数据
int n;
printf("请输入n:>");
scanf("%d", &n);
//时间戳
srand(time(0));
FILE* fin = fopen("data.txt", "w");//写
if (fin == NULL)
{
perror("fopen fail");
exit(-1);
}
int randK = k;
for (size_t i = 0; i < n; ++i)
{
int val = rand() % 100;
//写入文件:将3以2的形式写进1
fprintf(fin, "%d\n", val);
}
fclose(fin);
/
// 找topk
FILE* fout = fopen("data.txt", "r");//读
if (fout == NULL)
{
perror("fopen fail");
return;
}
//int minHeap[5];
int* minHeap = (int*)malloc(sizeof(int) * k);
if (minHeap == NULL)
{
perror("malloc fail");
return;
}
for (int i = 0; i < k; ++i)
{
//将1中的数据以2的形式输出到3
fscanf(fout, "%d", &minHeap[i]);
}
// 建小堆
for (int i = (k - 1 - 1) / 2; i >= 0; --i)
{
AdjustDown(minHeap, k, i);
}
//找出最大的k个数字
int val = 0;
while (fscanf(fout, "%d", &val) != EOF)
{
if (val > minHeap[0])
{
minHeap[0] = val;
AdjustDown(minHeap, k, 0);
}
}
//打印
for (int i = 0; i < k; ++i)
{
printf("%d ", minHeap[i]);
}
printf("\n");
fclose(fout);
}
感谢家人的阅读,若有不准确的地方 欢迎在评论区指正!