福哥答案2020-03-26: 口诀如下:冒选插希快 堆归计桶基(冒泡,选择,插入,希尔,快速,堆,归并,计数,桶,基数)冒线 平平 稳常小选平 平平 不常小插线 平平 稳常序希线 四组 不常组快四 四平 不对大堆四 四四 不常大归四 四四 稳线大计加 加加 稳k空桶加 加平 稳加空基乘 乘乘 稳加空 上述口诀是算法名称,最好时间复杂度,平均时间复杂度,最坏时间复杂度,是否稳定,空间复杂度,备注.线:线性阶.平:平方阶.四:线性平方阶.…
快排 Array.prototype.fastSort = function(){ var arr = this; function sort(left, right, arr){ if( left >= right){ return; } var key = arr[left]; var i = left; var j = right; while(i < j){ while(i < j && arr[j] >= key){ j--; } arr[i] = arr…
对冒泡.快排.堆排这3个算法做了验证,结果分析如下: 一.结果分析 时间消耗:快排 < 堆排 < 冒泡. 空间消耗:冒泡O(1) = 堆排O(1) < 快排O(logn)~O(n) . 应用推荐: 1.速度最快.且允许占用少量的空间:选快排. 2.速度快且空间最小(O(1)):选堆排. 3.要求相同大小的元素顺序不能变更:选冒泡. 4.完全不考虑空间消耗的:用基排(极限情况下时间O(n),限制较多,不单独说了). 冒泡排序: 优点:稳定.空间复杂度O(1) 缺点:慢 时间复杂度最好为n(…
堆排 堆排是基于二叉树而得来的 例如:对一个数组 可以转为二叉树:       二叉树特性父节点为 i ,  左叶子节点为2i+1:右叶子节点为2i+2; 步骤分解: 1. 先从第一个非叶子节点(即下标为(length-1-1)/2 即6)开始,把大的值往父节点调整     经过一轮调整之后 最大的值此时在根节点处(即arr[0]): 2.根节点数和数组最后一个元素进行交换,此时数组中最大的值在最后一位,一个有序元素产生, 3.反复进行此过程,再次交换时和未被排序的最后一个元素交换,直至数组有序…
本文就是介绍一些常见的排序算法.排序是一个非常常见的应用场景,很多时候,我们需要根据自己需要排序的数据类型,来自定义排序算法,但是,在这里,我们只介绍这些基础排序算法,包括:插入排序.选择排序.冒泡排序.快速排序(重点).堆排序.归并排序等等.看下图: 给定数组:int data[] = {9,2,7,19,100,97,63,208,55,78} , , , , , , , , ,  }; public static void insertSort() { int tmp, j = ; for…
题目描述 给定一个整数数组a[0,...,n-1],求数组中第k小数 输入描述 首先输入数组长度n和k,其中1<=n<=5000, 1<=k<=n 然后输出n个整形元素,每个数的范围[1, 5000] 输出描述 该数组中第k小数 样例输入 4 2 1 2 3 4 样例输出 2 其实可以用 堆 来做,保证根节点为最小值,然后逐步剔除.不过当然也可以直接排序.权当熟悉一下STL: #include <vector> #include <algorithm> #i…
#归并排序 def mergeSort(a,L,R) :     if(L>=R) :         return     mid=((L+R)>>1)     mergeSort(a,L,mid)     mergeSort(a,mid+1,R)     p=L     q=mid+1     t=[]     while(p<=mid and q<=R) :         if a[p]<=a[q] :             t.append(a[p])   …
个人博客地址:http://kyle.org.cn/2018/03/13/heapsort/ Java实现泛型堆排算法,用于N个对象中选择最大或者最小的前M个,其中M<=N 类似于Mysql中order by + limit的功能,如果有类似场景的需求,可以直接拷贝到项目中使用 Github源码地址:https://github.com/Kyle-Wilson1/Algorithm_Java/tree/master/heapsort 工程目录结构 BootStrap:启动类,测试入口 Node:…
P1177 [模板]快速排序 不用说,连题目上都标了是一道模板,那今天就来对能用到的许多排序方式进行一个总结: 选择排序 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾.以此类推,直到全部待排序的数据元素排完. 选择排序是不稳定的排序方法.(稳定不稳定最后再讲) 这是选择排序的思想:每一趟在n-i+1(i=1,2…
对一个数组中的元素按照顺序构建二叉树,就形成了一个(二叉)堆.(二叉树是虚拟的,并不是真的建立二叉树) 表示堆的数组A有两个重要属性:A.heapSize,表示堆里面有多少元素,数组里有多少元素在堆里  A.length,表示数组长度 例如数组A= {1,2,3,4,5,6,7,8,9,10},此时A.heapSize = A.length.除了最后一层之外,这个二叉树是完满的 最大堆:父节点的值总是不小于子节点的值,反应在数组中就是A[i]>=A[2i+1] && A[i]>…
C++ Primer 学习中. . . 简单记录下我的学习过程 (代码为主) /***************************************** STL-算法--Heap算法 堆排序算法 (heapsort) make_heap()         //把容器内的数据做堆排序 push_heap()         //向堆内放入元素 pop_heap()          //删除堆顶元素 sort_heap()         //把堆排还原成普通排序 **********…
堆排其实就是选择排序,只不过用了完全二叉树特性. 堆排思想 : 利用完全二叉树特性建堆和重复选择调整来得到有序数组. 完全二叉树有什么特性呢? 节点左对齐 ---> 层序遍历不会出现空,可以用数组表达(访问效率高) 那么可以将它映射到数组上,并且遵循一个规律: 设i为当前节点索引,     i->left = 2*i+1              i->right = 2*i+2   可得--> i = (i->left-1)/2 = (i->right-2)/2  =…
1. #define LeftChild(i) (2*(i)+1) void PercDown(vector<int>&num, int i, int n) { int child; int tmp; for (tmp = num[i]; LeftChild(i) < n; i = child) { child = LeftChild(i); if (child != n - 1 && num[child + 1] > num[child]) child++…
TMUX天下第一 全世界所有用CLI Linux的人都应该用TMUX,我爱它! ======================== 以下是正文 ======================== Linux下面常用的搜索命令有这些:find locate grep which whereis.其中在我用的SuSE上,并没有locate,所以也不能用它神奇的手动更新数据库和"高速"索引查找,而grep是文字查找命令(但是配合某些命令共同执行有奇效).下面我们来看一看他们都是干嘛的 上面四个窗…
一.ML-Agents简介 近期在学习Unity中的机器学习插件ML-Agents,做一些记录,用以简单记录或交流学习. 先简单说一下机器学习使用的环境场景:高视觉复杂度(Visual Complexity,例如星际争霸.Dota2职业玩家与AI竞技).高物理复杂度(Physical Complexity,例如模拟两足.四足生物行走,这里Unity ML-Agents官方也有相关例子).高认知复杂度(Congnitive Complexity,例如AlphaGo).以上几种场景利用传统算法较难搞…
心得1:不同版本的idea,一些选项的名称稍微有点不同,比如以前导入项目的选项名称都是import Project,但是我使用的版本是2020.03 导入项目的名称是 import Settings 心得2:版本2020.3 的idea 导入(maven)项目的方式和以前不同,可以直接在 File-> New -> Project from Existing Sources -> Project from Existing Sources -> Import project fro…
今天跟着左老师的视频,理解了四种复杂度为 O(N*log(N))的排序算法,以前也理解过过程,今天根据实际的代码,感觉基本的算法还是很简单的,只是自己写的时候可能一些边界条件,循环控制条件把握不好. //对于一个int数组,请编写一个选择冒泡算法,对数组元素排序. //给定一个int数组A及数组的大小n,请返回排序后的数组. //测试样例: //[1, 2, 3, 5, 2, 3], 6 //[1, 2, 2, 3, 3, 5] #include <iostream> using namesp…
import random import time from heapq import heappush, heappop def heapsort(iterable): h = [] for value in iterable: heappush(h, value) return [heappop(h) for i in range(len(h))] if __name__=="__main__": time_start = time.time() array = [random.r…
简单插入排序 适用于记录较少且基本有序的记录.算法思想:给定一个存在分界线的序列,分界线左边有序,右边无序,依次将右边的没排序的数与左边序列进行比较,插入相应位置,再对分界线做出相应调整,下面用图来说明. 代码如下: 时间复杂度:最好情况O(n),最坏O(n^2). 希尔排序 希尔排序是改进后的简单插入排序.算法思想:将序列分组排序,最后在进行一次简单插入排序. 至于如何分组,下面我将用图向大家展示 这些数的下标从0开始,即0,3 ,6,9为一组,1,4,7为一组,2,5,8为一组.也就是gap…
这篇博客源自对一个内存无法处理的词频统计问题的思考,最后给出的解决办法是自己想的,可以肯定这不是最好的解法.但是通过和同学的讨论,仍然感觉这是一个有意义及有意思的问题,所以和大家分享与探讨. 如果有误,请大家指正.如果有更好的方法,望不吝赐教. 1.提出问题 实际问题: 当前有10T中文关键词数据,需要统计出词频最高的1000个词.可用的只有1G内存和磁盘.那么如何提取? 大概估算一下这个问题,设中文词汇平均长度2.3,每次汉字用utf-8编码是3B,那么10T数据大概有 10T/7B ~ 1.…
一.堆-完全二叉树 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),是不稳定排序 堆排序中的堆有大顶堆.小顶堆两种.他们都是完全二叉树 将该堆按照排序放入列表 1. 大顶堆: 所有的父节点的值都比孩子节点大,叶子节点值最小.root 根节点是第一个节点值最大 2. 小顶堆: 和大顶堆相反,所有父节点值,都小于子节点值,root 根节点是 第一个节点值最小   二.堆排序 基本思路:将待排序序列构造成一个大顶堆,此时,整个序…
RPG的错排 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2068 题目大意: 有N个人对应N个名字,然后你去把每一个名字对应到每个人,只要求答对一半及以上就算是过关,问有多少组答案能让他过关. 思考过程: 一眼就发现是错排,从N个人当中选出M个,然后进行错排,M可以从 0 一直到 N / 2. 我还是wa了,因为一开始的时候没有考虑到M可以为0.如果M为0,即表示没有全部排错,为一组答案. 代码: #include<iostream> #in…
RPG的错排 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 13155    Accepted Submission(s): 5378 Problem Description 今年暑假杭电ACM集训队第一次组成女生队,其中有一队叫RPG,但做为集训队成员之一的野骆驼竟然不知道RPG三个人具体是谁谁.RPG给他机会让他猜猜,第一次猜:R是…
题目链接:https://vjudge.net/problem/HDU-2068 RPG的错排 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 14355    Accepted Submission(s): 5828 Problem Description 今年暑假杭电ACM集训队第一次组成女生队,其中有一队叫RPG,但做为集训队成员之…
RPG的错排 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 8996    Accepted Submission(s): 3699 Problem Description 今年暑假杭电ACM集训队第一次组成女生队,当中有一队叫RPG,但做为集训队成员之中的一个的野骆驼居然不知道RPG三个人详细是谁谁.RPG给他机会让他猜猜,第一次猜…
传送门 题意: 给你n个字符串,不同的排列有不同的代价,代价按照如下方式计算(字符串s的位置为x): 1.排在s后面的字符串有s的后缀,则代价为n^2: 2.排在s前面的字符串有s的后缀,且没有排在s后面的s的后缀,则代价为x-y(y为最后一个与s不相等的后缀的位置): 3.s没有后缀,则代价为x. 求最小代价和. 思路:显然把所有字符串倒序建一个trietrietrie树出来. 然后在上面贪心每次走sizesizesize最小的子树最优. 代码: #include<bits/stdc++.h>…
1.题意:1到N的序列的排列中,元素位置与元素值相对应的情况(值为i的元素在某个排列中正好排在第i个位置)大于等于序列规模一半的情况,有多少个? 2.输入输出:每组数据一个数,N,规定输入以0结尾: 3.分析:原题意换句话说,就是针对1到N的全排列,错排元素的个数小于等于N的情况有多少: 那么,输出即为:    ,其中F[i]表示1到i的错排方案数,后面一项为组合数,即选取i个错排: 这里推导一下错排公式,F[N]表示1到N的错排方案:第一步:选取N放到1到N-1之中任意一个位置,这样就有N-1…
Git简介: Git是一个分布式版本控制软件. 背景故事: Linus在1991年创建了开源的Linux. 在2002年以前:世界各地的志愿者把源代码文件通过diff的方式发给Linus,然后Linus本人通过手工方式合并代码. 2002年-2004年:(商用版本控制软件)BitKeeper的东家BitMover公司授权Linux社区免费使用这个版本控制系统. 2005年:Linus花了两周时间自己用C写了git(一个分布式版本控制软件). 2008年:GitHub网站上线了,它为开源项目免费提…
Linux df命令用于显示目前在Linux系统上的文件系统的磁盘使用情况统计. 就像在windows下打开我的电脑一样会统计各个磁盘一样的情况 主要用于查看磁盘空间占用情况 -- [@hong:~]$ df Filesystem 512-blocks Used Available Capacity iused ifree %iused Mounted on /dev/disk1s1 236363688 153535976 77350384 67% 771429 9223372036854004…
Libev中在管理定时器时,使用了堆这种结构,而且除了常见的最小2叉堆之外,它还实现了更高效的4叉堆. 之所以要实现4叉堆,是因为普通2叉堆的缓存效率较低,所谓缓存效率低,也就是说对CPU缓存的利用率比较低,说白了,就是违背了局部性原理.这是因为在2叉堆中,对元素的操作通常在N和N/2之间进行,所以对于含有大量元素的堆来说,两个操作数之间间隔比较远,对CPU缓存利用不太好.Libev中的注释说明,对于元素个数为50000+的堆来说,4叉堆的效率要提高5%所有. 在看Libev中堆的实现代码之前,…