
排序算法
河林山
这个作者很懒,什么都没留下…
展开
-
堆排序(啊哈算法版)
题意: ——给出n个数,从小到大排序。 前提知识: ——了解什么是树,什么是二叉树,什么是完全二叉树,以及特点 最小堆: 堆顶是最小值,一般放于数组的第一个位置,但是构建完最小堆后不能保证数据一定是按从小到大放置。 最小堆定义:在一棵完全二叉树中,所有的父结点都比子结点要小。 这里未强调左右子结点谁大谁小,请看第二个图(最小堆)便可明白。 堆排序思想: 以该数据为例:构建最小堆 14 99 5 36 7 22 17 46 12 2 19 25 28 1 92 构建一个完全二叉树 显而易见,此刻堆顶并不是原创 2022-03-01 14:18:47 · 694 阅读 · 0 评论 -
快速排序(先归并再快排)
题目: ——给出n个数,从小到大排序,并输出 牛客例题1 牛客例题2 Acwing例题3(此例题下面代码超时,该题需付费可做,最下面会提供可过代码) 啊哈一书快排思想: 二分思想: 先对大区间进行排序,并不是真正意义上的排好序: 1. 以大区间第一个数为哨兵,实现以下操作: a. 比它小的通通放到左边,比它大的通通放到右边 b. 并不要求哨兵的左右各部分必须是有序的 如何实现操作a,遍历交换即可 c. 需要两个指针i,j,最初指向区间的最左、最右端 让 j 从位置 j 往左找,找到比哨兵原创 2022-02-26 11:47:20 · 128 阅读 · 0 评论 -
归并排序(先归并再快排)
题意: ——给出n个数,从小到大输出 思想: 与快速排序区别是: 快速排序:先大区间排序,然后细化到小区间排序,最后区间长度为1时,顺序排好。 归并排序:先从小区间排序,然后扩大到大区间排序。 代码: #include<bits/stdc++.h> using namespace std; const int maxn=500005; int a[maxn],b[maxn]; void Merge(int low,int mid,int high) { int i=low,j=mid+1,原创 2022-02-26 19:48:02 · 325 阅读 · 0 评论 -
桶排序(简单思想)
题意: 给出n个数,将这n个数从小到大排序。 输入: 4 2 2 1 5 [不大于10] 输出: 1 2 2 5 桶排序思想: 拿这个例题来讲: 拿出11个桶,依次排开,对桶编号0~10 把每个数丢进相应的桶里面 依次输出即可。 代码: #include<stdio.h> #include<string.h> int a[11]; int main() { memset(a,0,sizeof(a)); int n,x;scanf("%d",&a原创 2022-02-25 21:51:14 · 267 阅读 · 0 评论 -
确定比赛名次(拓扑排序)HDU - 1285
题目:确定比赛名次 vjudge提交链接 题意: ——n支队伍,给出m行对战信息。 每行a,b表示a队赢了b队。 输出一个符合要求的队伍排名。 注意:若符合条件的排名不唯一,编号小的队伍在前。 注意:数据可能存在重复。 数据范围:n<=500。 题解: 若n的范围如题目所示,暴力+拓扑排序。 注意事项: 去重用sort排序或者二维数组标记都行。 一次只排一个队伍的名次,不然会错的。 若n超过十万,sort排序+邻接表+优先队列+拓扑排序 解释: sort排序:数据去重。 邻接表:存队伍信息。 优先队原创 2021-06-13 01:17:47 · 649 阅读 · 0 评论