博客网站开发背景推广品牌的方法
web/
2025/10/6 11:23:09/
文章来源:
博客网站开发背景,推广品牌的方法,4399在线观看免费韩国,wordpress酷炫特效目录
堆排序
整体思路
代码实现
Q1建大堆/小堆
Q2数据个数和下标
TopK问题
整体思路
代码实现
Q1造数据CreateData
Q2建大堆/小堆 建堆的两种方法这里会用到前面的向上/向下调整/交换函数。向上调整向下调整算法-CSDN博客
堆排序
整体思路 建堆#xff08;直…目录
堆排序
整体思路
代码实现
Q1建大堆/小堆
Q2数据个数和下标
TopK问题
整体思路
代码实现
Q1造数据CreateData
Q2建大堆/小堆 建堆的两种方法这里会用到前面的向上/向下调整/交换函数。向上调整向下调整算法-CSDN博客
堆排序
整体思路 建堆直接把数组搞成堆升序建大堆 降序建小堆利用堆删除的思想来进行堆排序 就是模拟堆删除的过程但是实际并不删除堆1交换头尾2向下调整除去最后一个元素最后一个元素已经排好序了3循环重复上述过程建队有两种方法插入向上调整建堆/向下调整建堆下篇细讲建堆和堆删除中都用到了向下调整因此掌握了向下调整就可以完成堆排序。 代码实现
//堆排序:本质直接在数组里面排序
void test1(int* a, int size)
{//方法1的时间/空间复杂度都很低//方法2//1.向上调整建堆 建堆--建的小堆--降序 建大堆--升序for (int i 0; i size; i){AdjustUp(a, i);}//1.向下调整建堆for (int i (size - 1 - 1) / 2; i 0; i--)//i0的时候到达根节点此时就是全部向下调整{Adjustdown(a, size, i);//这里的size不确定但是肯定比size小所以取最大就size}//2.while (size){//交换Swap(a[0], a[size - 1]);//向下调整(除去已经排序好的元素Adjustdown(a, size-1, 0);//到达下一个交换的位置size--;}
}
int main()
{int a[10] { 2,3,7,5,4,3,9,7,6,10 };int size sizeof(a) / sizeof(a[0]);//10个数最后一个数的下一个数的下标test1(a, size);//3.打印for (int i 0; i size; i){printf(%d , a[i]);}return 0;
}
Q1建大堆/小堆 升序建大堆 降序建小堆 Q2数据个数和下标 size指向最后一个元素的下一个位置 交换首位元素最后一个元素的下标size-1 出去排好的元素向下调整个数为size-1-1除去排好的元素 TopK问题 TOP-K问题即求数据结合中前K个最大的元素或者最小的元素一般情况下数据量都比较大。比如专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等。 整体思路 对于Top-K问题能想到的最简单直接的方式就是排序但是如果数据量非常大排序就不太可取了(可能数据都不能一下子全部加载到内存中)。最佳的方式就是用堆来解决基本思路如下 用数据集合中前K个元素来建堆前k个最大的元素则建小堆前k个最小的元素则建大堆用剩余的N-K个元素依次与堆顶元素来比较不满足则替换堆顶元素将剩余N-K个元素依次与堆顶元素比完之后堆中剩余的K个元素就是所求的前K个最小或者最大的元素。 代码实现
void CreateDate()//创造数据
{int n 1000000;srand((unsigned int)time(NULL));//随机数的种子//打开文件const char* file data.txt;//文件指针FILE* fin fopen(file, w);//以写的形式打开文件状态指针if (fin NULL)//打开失败{perror(fopen error);return;}//写文件for (int i 0; i n; i){int r (rand() i) % 1000000;fprintf(fin, %d\n, r);}//关闭文件fclose(fin);
}void test2(int K)
{//打开文件const char* file data.txt;//文件指针FILE* fout fopen(file, r);//以写的形式打开文件状态指针if (fout NULL)//打开失败{perror(fopen error);return;}//读取文件//开辟数组空间存放小堆int* a (int*)malloc(sizeof(int) * K);if (a NULL){perror(malloc error);return;}for (int i 0; i K; i){fscanf(fout, %d, a[i]);//读取放入数组AdjustUp(a, i);//建小堆}//一直读取并且比较int n 0;while (fscanf(fout,%d, n) ! EOF){if (a[0] n){a[0] n;Adjustdown(a, K, 0);}}//打印int i 0;for (i 0; i K; i){printf(%d , a[i]);}//释放空间/关闭文件free(a);fclose(fout);
}int main()
{//CreateDate();//创造数据int K 8;test2(K);//TopK问题--小堆--取前K个最大的数return 0;
}
Q1造数据CreateData 打开文件写文件关闭文件随机数随机数的种子产生随机数随机数最多3万个文件指针文件状态指针想要产生的随机数在100万以内%100万测试去文件里面修改值大于100万的数查看是否打印出来的是修改后的数据。 void CreateDate()//创造数据
{int n 1000000;srand((unsigned int)time(NULL));//随机数的种子//打开文件const char* file data.txt;//文件指针FILE* fin fopen(file, w);//以写的形式打开文件状态指针if (fin NULL)//打开失败{perror(fopen error);return;}//写文件for (int i 0; i n; i){int r (rand() i) % 1000000;fprintf(fin, %d\n, r);}//关闭文件fclose(fin);
} Q2建大堆/小堆 前k个最大的元素则建小堆 前k个最小的元素则建大堆 感谢大家的阅读若有错误和不足欢迎指正
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/87881.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!