# 《算法图解》中涉及的算法的总结及java实现 项目启动,项目使用maven搭建,如果不使用maven导入,请保证有Junit4的jar包在工程中. 将项目导入相应IDE,执行AlgorithmInGraphTest的showAlgorithm()方法,即可以执行相应的测试方法. ## 二分查找: **算法目的:** 查找在有序数组中某给定值的位置 **算法原理:** 当数组中元素有序排列时,通过比较数组中间位置的值和****给定值****的大小, 可以确定给定值在由中央位置分割而成的两个数组的哪一个部分,依次切割就能找到给定值的位置; **算法复杂度:** O(logn) **算法难点:** 需要确定循环的边界条件。 **算法实现:** ```$xslt private int doBinarySearch(int [] sortedArray,int value){ int right = sortedArray.length - 1; int left = 0; int middle; //这里=号容易被忽略 while(right>= left){ middle = (left+right)/2; if(sortedArray[middle] == value){ return middle; } else if(sortedArray[middle] < value){ left = middle+1; } else{ right = middle-1; } } return -1; } ``` ## 选择排序 **算法目的:** 将数组正确排序 **算法原理:** 依次选择最小(大)的值放到对应的位置 **算法复杂度:** O(n^2) **算法难点:**:无 **算法实现:** ```$xslt private void sort(int [] array){ for(int i = 0;i array[j]){ min = array[j]; index = j; } } if(i != index){ int temp = array[i]; array[i] = array[index]; array[index] = temp; } } } ``` ## 快速排序--分治 **算法目的:** 将数组正确排序 **算法原理:** 准一个基准值(一般选择数组中第一个值),将数组分成两部分,前一部分比基准值小,后一部分比基准值大. 然后将分割后的两个数组继续按这个方式分割,一直到子数组只剩下一个值,那么所有子数组都是排序好的,最后汇总起来也是排序好的数组 **算法复杂度:** O(n^2) **算法难点:**:无 **算法实现:** ``` private void quickSort(int [] array,int start,int end){ if(start >= end){ return; } int left = start; int right = end; int value = array[start]; while(left < right){ while(array[right] > value && left < right) right--; array[left] = array[right]; while(array[left] < value && left < right) left++; array[right] = array[left]; } array[left] = value; quickSort(array,left+1,end); quickSort(array,start,left-1); } ``` ## 广度优先搜索--图算法 最短路径 **算法目的:** 遍历图中节点的一种方法,可以找到两节点的最短路径 **算法原理:** 图的搜索算法,对每个节点:搜索其子节点(相连节点),如果该节点被搜索过,那么就跳过,否则加入到搜索节点队列;当前节点完成后,从队列中选择 第一个节点继续搜索.直到队列中不再有节点. **算法复杂度:** **算法难点:**:无 **算法实现:** ``` int point_num = graph[0].length; List result = new ArrayList(); Queue queue = new LinkedList(); List searchedList = new ArrayList(); //已经查找过的点 queue.offer(0); searchedList.add(0); int index = 0; while(!queue.isEmpty()){ Integer currentPoint = queue.poll(); result.add(currentPoint); for(int i = 0;i= weighs[0]){ currentState[i][j] = value[0]; } }else if(j >= weighs[i] ){ if(currentState[i-1][j-weighs[i]]+value[i] > currentState[i-1][j]){ currentState[i][j] = currentState[i-1][j-weighs[i]]+value[i]; }else{ currentState[i][j] = currentState[i-1][j]; } } else{ currentState[i][j] = currentState[i-1][j]; } if(maxResult < currentState[i][j]){ maxResult = currentState[i][j]; } } } ```