算法
田小江爱分享
程序媛,程序汪。目标是做一个有项目管理经验的技术专家。
展开
-
时间复杂度
常见的常数时间的操作常见的算数运算(+、-、*、/、%等) 常见的位运算(>>、>>>、<< 、|、&、^等) 赋值、比较、自增、自减操作等 数组寻址操作总之,执行时间固定的操作都是常数时间的操作。反之,执行时间不固定的操作,都不是常数时间的操作。常见的时间复杂度:排名从好到差O(1)O(logN)O(N)O(N*logN)O(N^2)O(N^3) ...O(N^K)O(N^2)O(N^3) ......原创 2021-09-06 21:31:41 · 112 阅读 · 0 评论 -
数据结构(三)——线性结构之栈Stack
1.栈是限定仅在表头进行插入和删除操作的线性表。 栈在中断处理特别是重要数据的现场保护有着重要意义。 栈相当于一个箱子,然后往箱子里一层一层的放东西,最先放的最后取,先进后出。 入口的一端为栈顶,另一端称作栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元...原创 2018-12-31 13:58:10 · 264 阅读 · 0 评论 -
数据结构(四)——线性结构之队列Queue
1.队列队列是先进先出的线性表。只允许在表的一端进行插入操作,而在另一端进行删除操作。进行插入的一端称为队尾,进行删除操作的一端称为队头。在具体应用中通常用链表或者数组来实现。2.从数据存储结构来划分,队列可以分为两类:顺序栈结构:即使用一组地址连续的内存单元依次保存队列中的数据。在程序中,可以定义一个指定大小的结构数组来作为队列。 链式栈结构,即使用链表形式保存队列中各...原创 2018-12-31 16:12:49 · 194 阅读 · 0 评论 -
数据结构(五)——线性结构之链表Linked List
一.链表典型的链表结构,链表中每个结点都应该包括如下内容:数据部分,保存的是该结点的实际数据; 地址部分,保存的是下一个结点的地址。由于采用了引用来指示下一个数据的地址。因此在链表结构中,逻辑上相邻的结点在内存中不一定相邻,逻辑相邻关系通过地址部分的引用变量来实现。(1)链表优点: 链表最大的好处是结点之间不要求连续存放,因此在保存大量数据的同时,不需要分配一块...原创 2019-01-03 12:16:44 · 289 阅读 · 0 评论 -
排序算法(二)——冒泡排序
冒泡排序算法的运作如下:比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。 针对所有的元素重复以上的步骤,除了最后一个。 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。冒泡排序总的平均时间复杂度为 package cn.kimtian.sort;im...原创 2019-01-03 17:55:37 · 267 阅读 · 0 评论 -
数据结构(八)——堆(Heap)
堆(heap)是计算机科学中一类特殊的数据结构的统称。堆结构是一种树结构,准确的说是一个完全二叉树。在这个树中每个结点对应于原始数据的一个记录。并且每个结点应该满足以下条件:如果按照从小到大的顺序排序。要求非叶结点的数据要大于或等于其左、右子结点的数据。称为大顶堆。 如果按照从大到小的顺序排序。要求非叶结点的数据要小于或等于其左、右子结点的数据。称为小顶堆,所以从堆结构的定义可以看出。...原创 2019-01-11 11:40:51 · 305 阅读 · 0 评论 -
排序算法(九)——堆排序
堆排序(Heap Sort)算法是基于选择排序思想的算法,其利用堆结构和二叉树的一些性质来完成数据的排序。堆排序算法的运作如下:(1)将数组变为一个大顶堆。(2)因为大顶堆的根结点为数组中的最大值,然后每次把根结点放到数组的最后面,并固定住。(3)以此类推,将前面的数字变为一个大顶堆...package cn.kimtian.sort;import java.util.A...原创 2019-01-11 17:37:05 · 150 阅读 · 0 评论 -
数据结构(七)——树结构(Tree) 之二叉树的常用操作
一.链式存储的二叉树的操作1.遍历二叉树先序遍历:根-->左-->右 中序遍历:左-->根-->右 后序遍历:左-->右-->根 层级遍历:逐层从左到输出2.二叉树结点的查找 结点的查找也可以分为先序查找,中序查找和后序查找。方式和遍历方式相似。3.删除二叉树结点二叉树抽象类代码package cn.kimtian.tree;...原创 2019-01-05 21:42:45 · 297 阅读 · 0 评论 -
常用算法(一)——递归(斐波那契数列和汉诺塔算法)
1.递归定义在一个方法(函数)的内部调用该方法(函数)本身的编程方式。2.递归实现(1)错误写法: 递归最容易引发的一个异常是栈溢出异常。 如果一直递归,没有结束条件,就会无限进行下去,引发栈溢出异常。package cn.kimtian.normalalgorithm;/** * 递归 * * @author kimtian */public clas...原创 2019-01-07 14:53:19 · 437 阅读 · 0 评论 -
排序算法 (一)——基础
1.定义:排序(sort)是将一组数据按照一定的规则来进行排列,一般按照递增或递减的顺序来进行排列,排序算法是一种基本的算法。2.排序算法的分类3.排序算法的优劣如何判断排序算法的优劣:计算的复杂度:为了全面考虑,往往从最差、平均和最好三种情况进行评价。 系统资源的占用:主要包括内存及其他资源的占用。一个好的排序应该占用少的内存资源。4.排序算法的复杂度排序方式 ...原创 2019-01-08 09:26:08 · 298 阅读 · 0 评论 -
数据结构(一)——数据结构基础
程序=数据结构+算法越工作越发现业务代码是很容易的,框架也是旧瓶装新水,大体差不多。那么好的代码的区分在于算法,性能这些的差距。而数据结构是算法实现的基础,算法总是要依赖某种数据结构来实现的。好久没有仔细看数据结构了,最近被频繁的算法,奈何我数据结构基础不好。决定好好复习一遍,并输出一份文档。一.数据结构1.什么是数据结构?数据结构是计算机中对数据的一种存储和组织方式,同时...原创 2018-12-28 17:39:37 · 237 阅读 · 0 评论 -
使用二分法完成一个简单的猜商品价格算法
package cn.kimtian.array.one;import java.util.Scanner;/** * 题目:出示一个任意价格的商品(在XXX-XXX元内),参与者要猜这件商品的价格,然后会有人给出相应高了或低了的提示,直到猜出这个价格为止 * 使用二分法来 * * @author kimtian */public class AlgorithmOne { ...原创 2018-12-28 12:23:28 · 1554 阅读 · 0 评论 -
数据结构(二)——数组Array
一.数组1.数组是典型的顺序存储结构。 数组是一种聚合数据类型,是将具有相同类型的若干变量有序地组织在一起的集合,数组可以说是最基本的数据结构。 一个数组可以分解为多个数组元素,按照数据元素的类型,数组可以分为整形数组、字符型数组、浮点型数组、对象数组等。 数组还可以有一维、二维以及多维等表现形式。2.数组的基本使用(1)创建一个数组// 创建一个数组...原创 2018-12-28 18:31:33 · 550 阅读 · 0 评论 -
数据结构(六)——树结构(Tree) 基础
一.什么是树结构?树(Tree)结构是一种描述非线性层次关系的数据结构。树是n个数据结点的集合,在该集合中包含一个根结点,根结点下分布着一些互不交叉的子集合,这些子集合是根结点的子树。树结构的基本特征如下:在一个树结构中,有且仅有一个结点没有直接前驱,这个结点就是树的根结点。 除根结点外,其余每个结点有且仅有一个直接前驱。 每个结点可以有任意多个直接后继。 一个树结构也可以是...原创 2019-01-03 21:45:32 · 596 阅读 · 0 评论 -
排序算法(三)——快速排序
快速排序(英语:Quicksort),简称快排,一种排序算法。在平均状况下,排序个项目要次比较。在最坏状况下则需要次比较。运作方式如下:1.从数组中挑出一个元素,作为基准,一般是第一个元素。2.重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以到任何一边)。在这个分割结束之后,该基准就处于数列的中间位置。3.递归的把小于基准值元素的子数...原创 2019-01-07 17:39:01 · 291 阅读 · 0 评论 -
排序算法(四)——插入排序
插入排序(英语:Insertion Sort)是一种简单直观的排序算法。通过对未排序的数据执行逐个插入至合适的位置而完成排序工作。插入排序算法的运作如下:1.首先对数组的前两个数据进行从小到大的排序;2.接着将第3个数据与排好序的两个数据进行比较,将第三个数据插入合适的位置;3.然后,将第4个数据插入已排好序的前3个数据中。4.不断重复上述过程,直到把最后一个数据插入合适的位置...原创 2019-01-07 21:52:06 · 186 阅读 · 0 评论 -
排序算法(五)——希尔排序
希尔排序,也称缩小增量排序或shell排序,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。希尔排序算法的运作如下:1. 将有n个元素的数组分为n/2个数字序列,第1个数据和第n/2+1个数据为一对,......2.一次循环使每一个序列对排好顺序;3.然后,再变成n/4个序列对,再次排序;4.不断重复上述过程,直到序列减少最后变为一个,也就完成了整个排序。 ...原创 2019-01-08 09:29:32 · 168 阅读 · 0 评论 -
排序算法(六)——选择排序
选择排序(Selection sort)是一种简单直观的排序算法。选择排序的交换操作介于和次之间。选择排序的比较操作为次。选择排序的赋值操作介于和次之间。运作方式如下:1.首先从原始数组中选择最小的1个数据,将其和位于第1个位置的数据交换。2.接着从剩下的n-1个数据中选择次小的一个数据,将其和第2个位置的数据交换。3.不断重复上述过程,直到最后两个数据完成交换。packag...原创 2019-01-07 21:04:12 · 301 阅读 · 0 评论 -
排序算法(七)——归并排序
归并排序(Merge Sort)算法就是将多个有序数据表合并成一个有序数据表。如果参与合并的只有两个有序表,则称为二路合并。对于一个原始的待排序序列,往往可以通过分割的方法来归结为多路合并排序。合并排序算法的运作如下:(1)首先将含有n个结点的待排序数据序列看成9个长度为1的有序子表。(2)将这些有序子表依次两两合并,得到长度为2的若干有序子表。(3)然后再对这些子表进行两两合并,...原创 2019-01-08 09:31:48 · 207 阅读 · 0 评论 -
排序算法(八)——基数排序
基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序。基数排序适用于大小数字都有,且位数不同。基数排序的算法运作方式如下:(1)首先根据个位数的数值,在走访数值时将它们分配至...原创 2019-01-08 09:31:29 · 191 阅读 · 0 评论 -
一道简单算法(使用快排)
题目是: 有一个无序数组,然后另外给定一个值n,输出数组中 相加大于n的 最少元素个数。 如数组为[2,4,4,7,7,8,9] ,n值为11,那8+9>11,最终结果为2.package com.other;import java.util.ArrayList;import java.util.List;/** * 一个无序数组,给定一个n,输出数组中 相...原创 2018-12-20 16:07:14 · 465 阅读 · 0 评论