算法
文章平均质量分 63
JeremyChan1887
这个作者很懒,什么都没留下…
展开
-
排序算法总结
一、常见问题1、什么是稳定性?哪些排序算法是稳定排序?稳定性,大概就是能保证排序前后,两个相等的数在序列中的相对次序不变,即,排序前A在A'前面,排序后A依然在A'前面。稳定的排序有:冒泡排序(每次比较相邻两个元素,当前者比后者大时交换,当两者相等时不交换)、插入排序(如果已排序部分的当前元素比待插入元素大才右移,相等则不右移)、归并排序(底层基于合并操作,而合并操作不改变相同元素的先后顺序)、不稳定的排序有:选择排序(5,8,5,2,9经过一轮排序之后,两个5的先后顺序发生了变化)、...原创 2020-09-26 08:27:17 · 166 阅读 · 0 评论 -
刷题总结
数组、链表、跳表:一般暴力可解决,优化思想一般有双指针、升维栈:具有最近相关性的问题,使用栈队列:具有先来后到特点的问题,使用队列滑动窗口都使用队列树:树问题的解法都是递归...原创 2020-06-16 12:50:49 · 179 阅读 · 0 评论 -
堆排序
目录一、基本原理二、代码实现1、二叉堆2、堆排序3、优先队列一、基本原理堆排序基于二叉堆(大顶堆、小顶堆)这一数据结构,二叉堆形状上就是完全二叉树。大顶堆就是任何一个节点都大于等于它的左孩子、右孩子;小顶堆则是任何一个节点都小于等于它的左孩子、右孩子。这两种结构的特点在于最大值、最小值放在堆顶的位置,另外父节点大于或小于其左右孩子节点。堆排序就是将数组转换为最大堆...原创 2020-02-12 22:45:01 · 137 阅读 · 0 评论 -
快速排序
目录一、基本原理二、代码实现1、快速排序的基本实现2、快速排序的迭代实现3、划分方法的其他实现方式4、稳定的快排5、三路快排一、基本原理快速排序的基本原理为,选取一个元素作为参照物,遍历整个数组,将小于等于参照物的元素放在数组左边位置,将大于参照物的元素放在数组右边,中间的位置存放参照物(左边的所有元素都比右边的所有数据都要小)。然后按此方法递归地对这两部...原创 2020-02-10 22:49:58 · 209 阅读 · 0 评论 -
归并排序
目录一、基本原理二、代码实现1、归并排序的基本实现2、迭代版本的归并排序3、空间复杂度为O(1)的归并排序4、最好情况的时间复杂度为O(n)的归并排序(Tim排序)一、基本原理归并排序的基本原理为:将序列平分为两个子序列(如果序列为奇数2*i+1个,则第一个子序列为i+1个,第二个子序列为i个),分别对子序列进行排序,再将已经有序的子序列合并,得到完全有序的序...原创 2020-02-07 15:58:20 · 1640 阅读 · 0 评论 -
选择排序
一、基本原理选择排序的基本原理为,将数组分成已排序和待排序的两部分,初始时已排序部分没有元素,数组的所有元素均在未排序部分中([0... arr.length-1])。每一轮从待排序的元素中选出一个最大元素放到已排序序列中,直到待排序部分为空或只有一个元素。具体来说,选择排序就是利用下标的大小,在每一轮中将剩余元素的最大值放在待排序序列的最大下标处,让待排序序列的边界减1。选择排序其实就...原创 2020-02-03 12:05:42 · 124 阅读 · 0 评论 -
插入排序
目录一、基本原理二、代码实现1、插入排序的基本实现(直接插入排序)2、寻找插入位置时,利用已排序部分的有序性,采用二分查找进行优化(二分插入排序)3、递归版本的直接插入排序4、希尔排序一、基本原理插入排序的基本原理为,将数组分成已排序和待排序的两部分,初始时已排序部分只有一个元素([0 ... 0]),其他元素均在未排序部分中([1 ... arr.lengt...原创 2020-02-02 12:48:41 · 156 阅读 · 1 评论 -
冒泡排序
目录一、基本原理二、代码实现1、冒泡排序基本实现2、在未排序部分已经有序的情况下,减少轮数提前退出3、当未排序部分右边的一些元素之间已经保持有序时,减少轮数提前退出4、递归版本的冒泡排序5、鸡尾酒排序一、基本原理冒泡排序是一种交换排序,越大的元素会随着交换不断“上浮”到最右端,因此称为“冒泡”。冒泡排序的基本原理为:每次比较相邻的一对元素,如果前一个大...原创 2020-02-01 20:21:06 · 322 阅读 · 0 评论 -
二分查找总结
一、概述1、定义二分查找是一种广泛使用的搜索算法,主要用于在有序数组(一般是升序,后面的内容也只是针对升序情况)上查找元素2、主要思想二分查找算法背后的主要思想是充分利用元素之间的有序性、以及数组的随机访问特性,每次都与查找区间的中间元素比较大小,根据比较结果不断将查找范围缩小一半(采用分治策略,剪枝?),直到元素被找到,或者,查找区间被缩小为03、工作流程将中间元素...原创 2019-12-10 16:42:21 · 1463 阅读 · 0 评论 -
【贪心策略】硬币问题
问题描述:有vi=1元、5元、10元、50元、100元、500元的硬币c1、c2、c3、c4、c5枚。若用这些硬币来凑出A元,最少需要多少枚硬币?贪心策略:初始化numOfCoins=0,若A>0每一次都优先挑金额最大的硬币 i 若该硬币金额大于A,则挑金额次之的硬币 若该硬币金额小于A & 该硬币的剩余数量 ci 不为0,则A=A-vi,...原创 2018-12-25 12:21:07 · 493 阅读 · 0 评论 -
【贪心策略】背包问题
问题描述:给定n个物体(它们的重量为:w1,w2,......,wn,价值为:v1,v2,......,vn) 和 一个承受重量为W的背包,每种物体都可以分割。问怎么选取这些物体,放在的背包中(不超过背包的承重),让所取的子集达到最大价值。贪心策略:优先选取性价比最高的物体,也就是 vi/wi 最高的第 i 个物体。当然也有其他的策略,比如优先取 vi 最高的物体、优先取 wi 最低的...原创 2018-12-24 17:57:09 · 740 阅读 · 0 评论 -
算法导论——第二章习题
2.1-3、问题描述:输入:一个规模为n的序列A=<a1, a2, ... , an>、一个值v输出:当v = A[i]时,输出下标 i ;当v没有在A中出现,输出特殊值NIL算法描述和验证:i = NILfor j = 0 to A.length do if A[j] = v then i = j ret...原创 2018-12-27 12:13:39 · 658 阅读 · 0 评论 -
【分治】归并排序
目录 一、二路归并实现二、二路归并的一点优化三、原地归并实现四、二路归并的非递归实现五、在归并排序中使用直接插入排序一、二路归并实现递归实现,栈空间:O(logn)、堆空间:O(nlogn) public static void mergeSort1(int[] arr) { // 多做一层包装,简化用户输入 mergeSort1(arr,...原创 2018-12-26 20:28:21 · 162 阅读 · 0 评论 -
【动态规划】三种背包问题(01背包、完全背包、多重背包)
一、01背包问题描述:给定n个物体(它们的重量为:w1,w2,......,wn,价值为:v1,v2,......,vn) 和 一个承受重量为W的背包,问怎么选取这些物体,放在背包中(不超过背包的承重),让所取的子集达到最大价值。1、基本实现首先,我们很自然想到穷举法,只要给出n个物体的所有组合(子集),分别各个子集的总价值,去掉那些总重量超过背包承重W的子集之后,对剩下的子集中找到总...原创 2018-12-21 18:33:35 · 28061 阅读 · 5 评论