• 学习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]
    18. else if(arr[mid]
    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. }

                                   

  • 相关阅读:
    redis配置文件详解
    R语言caTools包进行数据划分、scale函数进行数据缩放、class包的knn函数构建K近邻分类器
    非近轴衍射分束器的设计与严格分析
    JAVA12_01学习总结(MySQL,约束)
    【测试工具】Jmeter常用beanshell
    vscode launch.json
    sqlcoder实践
    最快最便捷的pytest使用allure测试报告
    LeetCode 75. 颜色分类
    SpringCloud全系列知识(3)——Http客户端Feign
  • 原文地址:https://blog.csdn.net/znc5201314/article/details/136423895