第一章 什么是数据结构和算法

数据结构的概述

数据结构是指 数据再计算机内存空间或磁盘空间中的组织形式

1.数据结构的特性

数据结构 优点 缺点
数组 插入快,如果知道下标可以快速存取 查找和删除慢  大小固定
有序数组 比无序数组查找快   插入和删除慢 大小固定
后进先出 存取其他项很慢
队列 先进先出 存取其他项很慢
链表 插入和删除快 查找慢
二叉树 查找,插入,删除都快(如果保持平衡) 删除算法复杂
红黑树 查找,插入,删除都快 树总是是平衡的 算法复杂
2-3-4树 查找,插入,删除都快 树总是平衡的 类似的数对磁盘存储有用 算法复杂
哈希表 如果key已知则存取快,插入快 删除慢 如果key不知存取慢 空间利用不足
插入 删除快,对最大数据存取快 对其他项存取慢
实现世界建模 有些算法慢 且 复杂

算法概述 

算法是完成特定任务的过程

database 数据库

record 记录

field 字段

key 关键字

java基本数据类型

int ,short, char ,byte, long ,double, float,boolean

 java 数据结构的类库

java.until.*;

第二章 数组

1.有序数组二分法查找

  1. public class SortArray {
  2. private int[] values = {2, 11, 44, 55, 357,358,400,414,505};
  3. //查找某值得索引
  4. private int find(int searchValue) {
  5. //|----------------------|
  6. //lower--> <--upper
  7. int lowerBound = 0;
  8. int upperBound = values.length - 1;
  9.  
  10. int current;
  11.  
  12. while (true) {
  13. current = (lowerBound + upperBound) / 2;
  14. //值判断
  15. if(values[current]==searchValue){
  16. return current;
  17. }else if(lowerBound>upperBound){
  18. //索引判断
  19. return -1;//can't find 跳出循环
  20. }else {
  21. if(values[current]>searchValue){
  22. //<--- upper (upper向内移动)
  23. upperBound=current-1;
  24. }else {
  25. //lower---> (lower向内移动)
  26. lowerBound=current+1;
  27. }
  28. }
  29.  
  30. }
  31. }
  32.  
  33. @Test
  34. public void test_find() {
  35. System.out.println(find(44));
  36. System.out.println(find(358));
  37. System.out.println(find(111));
  38. }
  39. }

  

二分法查找与 log(N)成正比

大 O 表示法 不要常数

O(1)是优秀

 性能良好

O(N) 性能一般

性能较差

大O时间图(时间受数据项个数影响):

无序数组 快速插入   查找删除慢

有序数据 可以使用二分法查找

 第三章  简单排序

简单排序包括

  1. 冒泡排序
  2. 选择排序
  3. 插入排序

一般的排序 方法 (CAS : compare and swap)

1.比较两个数据项

2.交换两个数据项,或复制其中一项

冒泡排序

冒泡排序就是 比较相邻  大的往右冒泡

1.比较两个队员

2.如果左边的大 则交换位置

3.向右移一个位置 一次比较下面两个

4.一直比较下去。。。。

(每个的左边 和其右边进行比较)

。。。。。。

。。。。。。

冒泡排序第一趟 (挑出最大值)

冒泡排序java代码

bubble [ˈbəbəl] 冒泡

  1. public class BubbleSort {
  2.  
  3. private int[] buildIntArray(int size){
  4. int[] arr=new int[size];
  5. for(int i=0;i<size;i++){
  6. arr[i]= RandomUtils.nextInt(1,100);
  7. }
  8. return arr;
  9. }
  10. /*
  11. 冒泡排序
  12. 大的值往右冒泡
  13. */
  14. public void bubble(int[] arr){
  15. int out,in,temp;
  16. //第一趟 最大的已经冒泡到最右边, 所以第二趟不用再排。 减掉 out--
  17. for(out=arr.length-1;out>0;out--){
  18. //从左到右依次冒泡 所以 从0 依次比较
  19. for(in=0;in<out;in++){
  20. //往右冒泡 若左边大于右边 冒泡
  21. if(arr[in]>arr[in+1]){
  22. temp=arr[in+1];
  23. arr[in+1]=arr[in];
  24. arr[in]=temp;
  25. }
  26. }
  27. }
  28. }
  29.  
  30. @Test
  31. public void testSort(){
  32. int []arr=buildIntArray(9);
  33. System.out.println(Arrays.toString(arr));
  34. bubble(arr);
  35. System.out.println(Arrays.toString(arr));
  36. }
  37. }

冒泡排序的 时间级别

第一趟 需要比较  n-1次

第二趟  需要比较  n-2次 

第三趟  需要比较  n-3次

。。。。。

=n(n-1)/2;

约为 N的平方

所以冒泡排序的时间复杂度 为   

 选择排序

选择排序改进了冒泡排序

选择排序: 就是查找选择最小值 放在最左边,这样左边的就排好序了

选择排序java代码

  1. public class SelectSort {
  2. private int[] buildIntArray(int size) {
  3. int[] arr = new int[size];
  4. for (int i = 0; i < size; i++) {
  5. arr[i] = RandomUtils.nextInt(1,100);
  6. }
  7. return arr;
  8. }
  9.  
  10. /*
  11. 选择排序
  12. 选出最小的放在左边
  13. */
  14. private void select(int[] arr) {
  15. int out, in, temp;
  16. //左边是排好序的 不用排了 所以out++
  17. for (out = 0; out < arr.length - 1; out++) {
  18. //out 左边是排好了的  比较 out以后的 
  19. for (in = out + 1; in < arr.length; in++) {
  20. //out是左边的值,in是右边的值 因为 in=out+1
  21. //如果 右边的值小 把它交换到左边
  22. if (arr[in] < arr[out]) {
  23. temp = arr[in];
  24. arr[in] = arr[out];
  25. arr[out] = temp;
  26. }
  27. }
  28. }
  29. }
  30.  
  31. @Test
  32. public void testSort() {
  33. int[] arr = buildIntArray(9);
  34. System.out.println(Arrays.toString(arr));
  35. select(arr);
  36. System.out.println(Arrays.toString(arr));
  37. }
  38. }

  选择 排序  时间复杂度 

但是选择排序的速度快于冒泡排序 因为它进行的交换次数少;

插入排序

插入排序 一般情况下 比冒泡排序快一倍 ,比选择排序还要快一点

采用 局部有序 的方法

java代码

  1. public class InsertSort {
  2. private int[] buildIntArray(int size) {
  3. int[] arr = new int[size];
  4. for (int i = 0; i < size; i++) {
  5. arr[i] = RandomUtils.nextInt(0,100);
  6. }
  7. return arr;
  8. }
  9.  
  10. public void insert(int[] arr){
  11. int in,out;
  12. //外围的 循环次数 逐渐增加, 因为 左边排好的个数逐渐增加
  13. for(out=1;out<arr.length;out++){
  14. int temp=arr[out];//被标记的值,要排序的值
  15. in=out;//和左边已经排好的值 进行比较
  16. //从最大值 依次向左 逐个比较
  17. // 如果 左边的最大值 大于 temp ,再往左 找个小的值 和 temp比较
  18. //while 没我大 排到后面去
  19. while (in>0&&arr[in-1]>=temp){
  20. arr[in]=arr[in-1];
  21. --in;
  22. }
  23. arr[in]=temp;
  24. }
  25. }
  26. @Test
  27. public void testSort() {
  28. int[] arr = buildIntArray(9);
  29. System.out.println(Arrays.toString(arr));
  30. insert(arr);
  31. System.out.println(Arrays.toString(arr));
  32. }
  33. }

  插入排序的时间复杂度也是 

第四章 栈和队列

受限访问 ,更加抽象 作为构思算法的辅助工具

栈(stack)  

后进先出

栈只允许访问一个数据项,即最后插入的数据项。移除第一个数据项后 ,才可以访问第二个数据项。

  1. 用栈来检测 源程序中的  小括号,大括号 是否匹配
  2. 用栈来辅助遍历树的节点
  3. 微处理器运用栈的体系架构

用数组实现一个简单的栈

peek [pēk] :窥视

  1. public class StackA {
  2. private int[] arr;
  3. private int max;
  4. private int top;
  5.  
  6. public StackA(int max) {
  7. this.max = max;
  8. this.arr=new int[max];
  9. this.top=-1;
  10. }
  11.  
  12. public void push(int v){
  13. arr[++top]=v;
  14. }
  15.  
  16. public int pop(){
  17. return arr[top--];
  18. }
  19. /*
  20. Look at the obj at the top of stack without remove it
  21. */
  22. public int peek(){
  23. return arr[top];
  24. }
  25.  
  26. public boolean isEmpty(){
  27. return top==-1;
  28. }
  29.  
  30. public boolean isFull(){
  31. return top==max-1;
  32. }
  33.  
  34. }

测试

  1. public void test(){
  2. StackA stackA=new StackA(7);
  3. stackA.push(1);
  4. stackA.push(2);
  5. stackA.push(3);
  6. stackA.push(4);
  7. stackA.push(5);
  8.  
  9. while (!stackA.isEmpty()){
  10. System.out.println(stackA.pop());
  11. }
  12. }

  

写个demo检测 输入内容的 括号是否正确

bracket [ˈbrakit] : 括号

  1. public class Bracket {
  2. private String input;
  3.  
  4. public Bracket(String input) {
  5. this.input = input;
  6. }
  7.  
  8. public void check() {
  9. if (StringUtils.isNotBlank(input)) {
  10. StackA stackA = new StackA(input.length());
  11. for (int i = 0; i < input.length(); i++) {
  12. char c = input.charAt(i);
  13. switch (c) {
  14. case '{':
  15. case '[':
  16. case '(':
  17. stackA.push(c);
  18. break;
  19. case '}':
  20. case ']':
  21. case ')':
  22. if (!stackA.isEmpty()) {
  23. char store = (char) stackA.pop();
  24. if ((c == '}' && store != '{')
  25. || (c == ']' && store != '[')
  26. || (c == ')' && store != '(')
  27. ) {
  28. System.out.println("Error " + c + " at " + i);
  29. return;
  30. }
  31. } else {
  32. System.out.println("Error " + c + " at " + i);
  33. return;
  34. }
  35. break;
  36. default:
  37. break;
  38. }
  39. }
  40. if (!stackA.isEmpty()) {
  41. System.out.println("Error no bracket match with " + (char) stackA.peek());
  42. }
  43. }
  44. }
  45. }

测试

  1. public void test(){
  2. Bracket bracket=new Bracket("test(just test}");
  3. bracket.check();
  4. bracket=new Bracket("test :just test {");
  5. bracket.check();
  6. }

运行结果

  

  

  

java数据结构和算法学习笔记的更多相关文章

  1. 《Java数据结构与算法》笔记-CH4-2用栈实现字符串反转

    import java.io.BufferedReader; import java.io.InputStreamReader; //用栈来实现一个字符串逆序算法 /** * 数据结构:栈 */ cl ...

  2. 《Java数据结构与算法》笔记-CH4-3用栈实现分隔符匹配

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; /** * 利 ...

  3. 《Java数据结构与算法》笔记-CH3简单排序

    class ArrayBub { private long[] arr; private int nElement; public ArrayBub(int size) { arr = new lon ...

  4. 《Java数据结构与算法》笔记-CH1

    /** * 数据结构的特性 ************************************************************************************** ...

  5. 《Java数据结构与算法》笔记-CH5-链表-4用链表实现堆栈

    //用链表实现堆栈 /** * 节点类 */ class LinkS { private long data; public LinkS next; public LinkS(long d) { th ...

  6. 《Java数据结构与算法》笔记-CH5-链表-3双端链表

    /** * 双端链表的实现 */ class LinkA { public long dData; public LinkA next; public LinkA(long d) { dData = ...

  7. 《Java数据结构与算法》笔记-CH5-链表-2单链表,增加根据关键字查找和删除

    /** * Link节点 有数据项和next指向下一个Link引用 */ class Link { private int iData;// 数据 private double dData;// 数据 ...

  8. 《Java数据结构与算法》笔记-CH5-链表-1单链表

    /** * Link节点 * 有数据项和next指向下一个Link引用 */ class Link { private int iData;//数据 private double dData;//数据 ...

  9. 《java数据结构与算法》笔记-CH4-8栈结构实现后缀表达式计算结果

    /** * 中缀表达式转换成后缀表达式: 从输入(中缀表达式)中读取的字符,规则: 操作数: 写至输出 左括号: 推其入栈 右括号: 栈非空时重复以下步骤--> * 若项不为(,则写至输出: 若 ...

随机推荐

  1. 去除SVN图标并解除svn控制 (转)

    今天一不小心把F盘弄成了SVN管理项目,结果如图: 看到这个,当场晕菜,经过不懈的努力终于找到一种方法,如下: 右键  ===>TortoiseSVN   ===>Settings 点击确 ...

  2. ubuntu-server部署php+mysql运行环境

    1.apt-get install git php5 mysql-server apache2 phpmyadmin 2.sudo ln -s /usr/share/phpmyadmin /var/w ...

  3. 使用#include消除重复代码

    消除重复代码代码很多种,比如: 1)提炼成函数复用 2)使用宏 3)继承 4)使用闭包(boost::bind.boost::function) 上述是最为常用的,对于C++程序,闭包可能用得相对少一 ...

  4. java软件托盘显示中文出现框框乱码

    目录 文章背景 目录 问题的代码 解决办法 说明 参考文章 版本记录 文章背景 测试代码时候突然发现代码运行时候的托盘菜单的名字显示异常,查询了下资料发现是运行参数的缘故. 目录 问题的代码 系统是w ...

  5. struts整合dropzone.js上传图片遇到的点问题

    问:struts后台无法获取文件对象和文件名称? 答:1. 到dropzone.js搜索"return xhr.send(formData);" 2. 在它前面有个这么句代码: f ...

  6. XE10开发的APP对于苹果IPV6上架要求的处理(DelphiTeacher)

    1.服务器必须使用域名.不能使用IP地址2.Indy的话,域名加[]3.DataSnap的话,Params.Values['CommunicationIPVersion'] :='IP_IPv6';4 ...

  7. [HAOI2010]计数(组合数学)(数位DP)

    原题题意也就是给的数的全排列小于原数的个数. 我们可以很容易的想到重复元素的排列个数的公式. 但是我们发现阶乘的话很快就会爆long long啊(如果您想写高精请便) 之后我就尝试质因数分解....但 ...

  8. nowcoder(牛客网)OI测试赛2 解题报告

    qwq听说是一场普及组难度的比赛,所以我就兴高采烈地过来了qwq 然后发现题目确实不难qwq.....但是因为蒟蒻我太蒻了,考的还是很差啦qwq orz那些AK的dalao们qwq 赛后闲来无事,弄一 ...

  9. pos机代理行业

        传统模式(代理):代理商线性分润,代理商或营运商给一代大量的机器及要求,而且这个要求公对公结算(必须要有公司),分润也是直接给一代.然后一代找二代推广,层层发展.这样你会很担心你的上家的上家突 ...

  10. Django-02路由层

    U RL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于客户端发来的某个URL调用哪一段逻辑代 ...