当前位置:   article > 正文

学习JAVA的第十二天(基础)

学习JAVA的第十二天(基础)

目录

算法

查找算法

基本查找(顺序查找)

二分查找(折半查找)

分块查找

 排序算法

冒泡排序

选择排序

插入排序

快速排序

递归算法 


 

算法

                        算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。


查找算法

基本查找(顺序查找)

关键:

                        0索引开始依次向后查找

方法:

  1. public static boolean basicSearch(int[] arr,int number) {
  2. //基本查找 遍历数组查找所需结果
  3. for (int i = 0; i < arr.length; i++) {
  4. if(number == arr[i]){
  5. return true;
  6. }
  7. }
  8. return false;
  9. }
  10. }

二分查找(折半查找)

关键:

                        数组中的数据是有序的

                        每次排除一半的查找范围,节省查找次数

方法:

  1. public static int BinarySearch(int[] arr,int number) {
  2. //定义变量确定查找范围 最小肯定是0索引的
  3. int min = 0;
  4. //最大的索引是数组长度-1
  5. int max = arr.length-1;
  6. //开始循环查找数据,利用while循环,查找出索引直接返回结果
  7. while(true){
  8. if(min > max){
  9. //返回-1,调用时可以将-1与0作比较,得出数据索引是否存在
  10. return -1;
  11. }
  12. //中间位置
  13. int mid = (min + max) / 2;
  14. //arr[mid]>number
  15. if(arr[mid]>number){
  16. max = mid - 1;
  17. }//arr[mid]<number
  18. else if(arr[mid]<number){
  19. min = mid + 1;
  20. }else{
  21. return mid;
  22. }
  23. }
  24. }

分块查找

关键:

                                块内无序,块间有序

                                一般分块是按照数组长度开根号

                                具体问题,具体分析 

方法:

  1. //判断number在哪个块中
  2. private static int findIndexBlock(Block[] bArr,int number){
  3. //循环判断number在哪个块中
  4. for (int i = 0; i < bArr.length; i++) {
  5. if(number <= bArr[i].getMax()){
  6. return i;
  7. }
  8. }
  9. return -1;
  10. }
  1. //利用分块查找获取索引
  2. private static int getIndex(Block[] bArr,int[] arr,int number){
  3. int indexBlock = findIndexBlock(bArr,number);
  4. //数据不在数组中
  5. if(indexBlock == -1){
  6. return -1;
  7. }
  8. //数据在数组中 刚才获取了数据所属块的索引
  9. int startIndex = bArr[indexBlock].getStartIndex();
  10. int endIndex = bArr[indexBlock].getEndIndex();
  11. //遍历
  12. for (int i = startIndex; i <= endIndex; i++) {
  13. if(arr[i] == number){
  14. return i;
  15. }
  16. }
  17. return -1;
  18. }

 排序算法

冒泡排序

关键:

                                将相邻的数据进行比较,小的放前面,大的放后面。

方法:

  1. for(int i = 0; i < arr.length - 1; i++){
  2. for (int j = 0; j < arr.length - 1-i; j++) {
  3. if (arr[j] > arr[j + 1]) {
  4. int tmp = arr[j];
  5. arr[j] = arr[j + 1];
  6. arr[j + 1] = tmp;
  7. }
  8. }
  9. }

选择排序

关键 :

                           从0索引开始,用每个索引的元素与后面依次比较,小的放前面,大的放后面。

方法:

  1. //循环次数
  2. for(int i = 0; i < arr.length-1;i++){
  3. //从哪个索引开始比较
  4. for (int j = 1+i; j < arr.length; j++) {
  5. if (arr[i] > arr[j]) {
  6. int tmp = arr[i];
  7. arr[i] = arr[j ];
  8. arr[j ] = tmp;
  9. }
  10. }
  11. }

插入排序

关键:

                         将0索引到n索引看成有序的,n+1到最大索引是无序的。遍历无序数据,将其插入有序数据的合适位置

方法:

  1. //确定无序数据的开始索引,依次插入有序数据中
  2. for (int i = startIndex; i < arr.length; i++) {
  3. int j = i;
  4. //相当于依次向左比较,直至到0索引为止
  5. while(j > 0 && arr[j] < arr[j-1]){
  6. int tmp = arr[j];
  7. arr[j] = arr[j-1];
  8. arr[j-1] = tmp;
  9. j--;
  10. }
  11. }

快速排序

关键:

                        将0索引的数据作为基准数,左边都是比基准数小的,右边都是比基准数大的

方法:

  1. public static void QuickSort(int[] arr, int startIndex, int endIndex) {
  2. //定义两个查找的范围 start~end
  3. int start = startIndex;
  4. int end = endIndex;
  5. //递归的出口
  6. if(end < start){
  7. return;
  8. }
  9. //0索引为基准数
  10. int baseNumber = arr[startIndex];
  11. while(end != start){
  12. while (true) {
  13. if (start >= end || arr[end] < baseNumber) {
  14. break;
  15. }
  16. end--;
  17. }
  18. while (true) {
  19. if (start >= end || arr[start] > baseNumber) {
  20. break;
  21. }
  22. start++;
  23. }
  24. int tmp = arr[start];
  25. arr[start] = arr[end];
  26. arr[end] = tmp;
  27. }
  28. int tmp = arr[start];
  29. arr[start] = arr[startIndex];
  30. arr[startIndex] = tmp;
  31. //递归条件
  32. QuickSort(arr,startIndex,start-1);
  33. QuickSort(arr,start+1,endIndex);
  34. }

递归算法 

                方法中调用方法本身的现象

关键:

                递归算法一定要有出口,否则内存会溢出

                以大化小解决问题

方法:

  1. //简单的累加递归
  2. public static int Recursion(int number) {
  3. if(number == 1){
  4. return 1;
  5. }
  6. return number+Recursion(number-1);
  7. }

         

  1. //简单的求阶乘的递归
  2. public static int getNumber(int number) {
  3. if(number == 1){
  4. return 1;
  5. }
  6. return number * getNumber(number-1);
  7. }

                               

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/185413
推荐阅读
相关标签
  

闽ICP备14008679号