当前位置:   article > 正文

常见基础算法

常见基础算法

目录

1.1认识算法

1.2冒泡排序

1.3选择排序

1.4查找算法


1.1认识算法

接下来,我们认识一下什么是算法。算法其实是解决某个实际问题的过程和方法。比如百度地图给你规划路径,计算最优路径的过程就需要用到算法。再比如你在抖音上刷视频时,它会根据你的喜好给你推荐你喜欢看的视频,这里也需要用到算法。

我们为什么要学习算法呢?主要目的是训练我们的编程思维,还有就是面试的时候,面试官也喜欢问一下算法的问题来考察你的技术水平。最后一点,学习算法是成为一个高级程序员的必经之路。

1.2冒泡排序

接下来,我们学习一种算法叫排序算法,它可以价格无序的整数,排列成从小到大的形式(升序),或者从大到小的形式(降序)

排序算法有很多种,我们这里只学习比较简单的两种,一种是冒泡排序,一种是选择排序。学习算法我们先要搞清楚算法的流程,然后再去“推敲“如何写代码。(注意,我这里用的次是推敲,也就是说算法这样的代码并不是一次成型的,是需要反复修改才能写好的)。

先来学习冒泡排序,先来介绍一下,冒泡排序的流程

冒泡排序核心思路:每次将相邻的两个元素继续比较
如下图所示:
   第一轮比较 3次
   第二轮比较 2次
   第三轮比较 1次

 

  1. public class Test1 {
  2. public static void main(String[] args) {
  3. // 1、准备一个数组
  4. int[] arr = {5, 2, 3, 1};
  5. // 2、定义一个循环控制排几轮
  6. for (int i = 0; i < arr.length - 1; i++) {
  7. // i = 0 1 25231】 次数
  8. // i = 0 第一轮 0 1 2 3
  9. // i = 1 第二轮 0 1 2
  10. // i = 2 第三轮 0 1
  11. // 3、定义一个循环控制每轮比较几次。
  12. for (int j = 0; j < arr.length - i - 1; j++) {
  13. // 判断当前位置的元素值,是否大于后一个位置处的元素值,如果大则交换。
  14. if(arr[j] > arr[j+1]){
  15. int temp = arr[j + 1];
  16. arr[j + 1] = arr[j];
  17. arr[j] = temp;
  18. }
  19. }
  20. }
  21. System.out.println(Arrays.toString(arr));
  22. }
  23. }

1.3选择排序

刚才我们学习了冒泡排序,接下来我们学习了另一种排序方法,叫做选择排序。按照我们刚才给大家介绍的算法的学习方式。先要搞清楚算法的流程,再去推敲代码怎么写。

所以我们先分析选择排序算法的流程:选择排序的核心思路是,每一轮选定一个固定的元素,和其他的每一个元素进行比较;经过几轮比较之后,每一个元素都能比较到了。

 接下来,按照选择排序的流程编写代码

  1. ublic class Test2 {
  2. public static void main(String[] args) {
  3. // 1、准备好一个数组
  4. int[] arr = {5, 1, 3, 2};
  5. // 0 1 2 3
  6. // 2、控制选择几轮
  7. for (int i = 0; i < arr.length - 1; i++) {
  8. // i = 0 第一轮 j = 1 2 3
  9. // i = 1 第二轮 j = 2 3
  10. // i = 2 第三轮 j = 3
  11. // 3、控制每轮选择几次。
  12. for (int j = i + 1; j < arr.length; j++) {
  13. // 判断当前位置是否大于后面位置处的元素值,若大于则交换。
  14. if(arr[i] > arr[j]){
  15. int temp = arr[i];
  16. arr[i] = arr[j];
  17. arr[j] = temp;
  18. }
  19. }
  20. }
  21. System.out.println(Arrays.toString(arr));
  22. }
  23. }

1.4查找算法

接下来,我们学习一个查找算法叫做二分查找。在学习二分查找之前,我们先来说一下基本查找,从基本查找的弊端,我们再引入二分查找,这样我们的学习也会更加丝滑一下。

先聊一聊基本查找:假设我们要查找的元素是81,如果是基本查找的话,只能从0索引开始一个一个往后找,但是如果元素比较多,你要查找的元素比较靠后的话,这样查找的此处就比较多。性能比较差。

再讲二分查找:二分查找的主要特点是,每次查找能排除一般元素,这样效率明显提高。但是二分查找要求比较苛刻,它要求元素必须是有序的,否则不能进行二分查找。

二分查找的核心思路

第1步:先定义两个变量,分别记录开始索引(left)和结束索引(right)
第2步:计算中间位置的索引,mid = (left+right)/2;
第3步:每次查找中间mid位置的元素,和目标元素key进行比较
        如果中间位置元素比目标元素小,那就说明mid前面的元素都比目标元素小
            此时:left = mid+1
        如果中间位置元素比目标元素大,那说明mid后面的元素都比目标元素大
            此时:right = mid-1
        如果中间位置元素和目标元素相等,那说明mid就是我们要找的位置
            此时:把mid返回        
注意:一搬查找一次肯定是不够的,所以需要把第1步和第2步循环来做,只到left>end就结束,如果最后还没有找到目标元素,就返回-1.

 

 

  1. /**
  2. * 目标:掌握二分查找算法。
  3. */
  4. public class Test3 {
  5. public static void main(String[] args) {
  6. // 1、准备好一个数组。
  7. int[] arr = {7, 23, 79, 81, 103, 127, 131, 147};
  8. System.out.println(binarySearch(arr, 150));
  9. System.out.println(Arrays.binarySearch(arr, 81));
  10. }
  11. public static int binarySearch(int[] arr, int data){
  12. // 1、定义两个变量,一个站在左边位置,一个站在右边位置
  13. int left = 0;
  14. int right = arr.length - 1;
  15. // 2、定义一个循环控制折半。
  16. while (left <= right){
  17. // 3、每次折半,都算出中间位置处的索引
  18. int middle = (left + right) / 2;
  19. // 4、判断当前要找的元素值,与中间位置处的元素值的大小情况。
  20. if(data < arr[middle]){
  21. // 往左边找,截止位置(右边位置) = 中间位置 - 1
  22. right = middle - 1;
  23. }else if(data > arr[middle]){
  24. // 往右边找,起始位置(左边位置) = 中间位置 + 1
  25. left = middle + 1;
  26. }else {
  27. // 中间位置处的元素值,正好等于我们要找的元素值
  28. return middle;
  29. }
  30. }
  31. return -1; // -1特殊结果,就代表没有找到数据!数组中不存在该数据!
  32. }
  33. }

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

闽ICP备14008679号