首页 > 代码库 > [学习笔记]数据结构与算法
[学习笔记]数据结构与算法
1.排序
简单排序:
?冒泡排序:将n个数从上往下排列,从第0个数开始依次对前n个、前n-1个、前n-2个数进行比较,保持小数在前大数在后,不符合就交换。在这个过程中,最后一个数始终是最大数。
?选择排序:对所有n个、后n-1个、后n-2个依次比较,用一个变量存最小数,一趟比较完成之后,将最小数与所比较数据的第一个数进行交换。在这个过程中,第一个数始终是最小数。
?插入排序:从第1个数开始向前扫描比较,小则插入。对于未排序数据,在已排序序列中向前扫描,并找到相应的位置插入。在这个过程中,整个序列局部有序
高级排序:快速排序,希尔排序,堆排序,归并排序
有篇博客以动态图的方式画出了排序时的效果,很有趣,等看完这7种排序算法之后再看看,一定能加深印象。
http://www.blogjava.net/todayx-org/archive/2012/01/08/368091.html
2.数据存储结构
?数组:应用最广泛的存储结构,但由于其存储地址的连续性,不适用于较大规模的数据。
?栈:后进先出LIFO。应用示例:单词逆序,分隔符匹配。
栈的应用:求解算术表达式的值(包括数字、四种操作符加减乘除、括号)
步骤:先将中缀表达式转为后缀表达式,然后利用栈求其运算结果。这样做的目的是运算符不同,运算顺序就不同,转为后缀表达式后不用考虑运算顺序,遍历表达式,遇到运算符将栈顶两个数字做运算即可。
?队列:先进先出FIFO。
?循环队列:由数组作为存储结构的队列,由于其数据被删除后不会自动往前移动,所以队尾指针到达末端时无法再插入数据,由此有了循环队列,可以理解为一个环。
?双端队列:两端都可插入、删除,禁止某些方法后可模拟栈或队列,不常用;
?优先级队列:按关键字排序的队列,可以快速访问最小或最大值,插入较慢,常用堆来实现
?循环队列:由数组作为存储结构的队列,由于其数据被删除后不会自动往前移动,所以队尾指针到达末端时无法再插入数据,由此有了循环队列,可以理解为一个环。
?双端队列:两端都可插入、删除,禁止某些方法后可模拟栈或队列,不常用;
?优先级队列:按关键字排序的队列,可以快速访问最小或最大值,插入较慢,常用堆来实现
?链表
单链表、双端链表(头结点包含一个指向第一个元素和最后一个元素的指针)、有序链表、双向链表(每个节点都包含一个向前和向后的指针)的插入、删除、查找操作;
抽象数据类型ADT:栈和队列就属于抽象数据类型,可用数组、链表等结构来实现;
迭代器:java中已经封装了java.util.Iterator,用于对列表元素进行遍历等操作;
单链表、双端链表(头结点包含一个指向第一个元素和最后一个元素的指针)、有序链表、双向链表(每个节点都包含一个向前和向后的指针)的插入、删除、查找操作;
抽象数据类型ADT:栈和队列就属于抽象数据类型,可用数组、链表等结构来实现;
迭代器:java中已经封装了java.util.Iterator,用于对列表元素进行遍历等操作;
?二叉树
3.递归
定义:方法中调用自己的编程技术。
应用:三角数字、阶乘、变位字(对字符串进行按字符的排列组合)、汉诺塔问题、二分查找、归并排序
分治算法:把一个大问题分成两个相对较小的问题,每个小问题又可以分成两个更小的问题,直到达到易于求解的基值情况;且每个问题的解决办法都是相同的。
弊端:容易理解,但是有时候执行效率不高。
消除递归:可通过循环或栈来消除递归。
定义:方法中调用自己的编程技术。
应用:三角数字、阶乘、变位字(对字符串进行按字符的排列组合)、汉诺塔问题、二分查找、归并排序
分治算法:把一个大问题分成两个相对较小的问题,每个小问题又可以分成两个更小的问题,直到达到易于求解的基值情况;且每个问题的解决办法都是相同的。
弊端:容易理解,但是有时候执行效率不高。
消除递归:可通过循环或栈来消除递归。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。