JavaSE——算法(1/2):认识、冒泡排序、选择排序及优化(介绍、详细图解、代码)

简介: JavaSE——算法(1/2):认识、冒泡排序、选择排序及优化(介绍、详细图解、代码)

认识算法

什么是算法?


算法就像是一个厨房里的食谱。当你想做一道菜时,你需要按照食谱上的步骤来操作,确保每一步都做对了,这样才能做出美味的菜肴。同样地,算法就是一系列解决问题的步骤,它告诉计算机如何处理数据,从而得到我们想要的结果

算法就像是一个聪明的助手,它可以帮助我们完成各种任务,比如排序、搜索、预测天气等等。只要我们给它正确的指令和数据,它就能按照预定的步骤,快速而准确地完成任务。


为什么要学习算法?


学习算法可以让我们更好地理解编程的本质,提高我们的编程能力。这样,我们就可以写出更好的程序,解决更复杂的问题。而且算法不仅可以用在计算机上,还可以用在生活中的很多地方。例如,烹饪食谱、旅行计划、投资策略等都可以看作是一种算法。

学习算法的技巧


  1. 理解问题:在尝试编写代码之前,首先要彻底理解问题。先搞清楚算法的流程。
  2. 逐步实现:将算法分解成小的、可管理的部分,并逐步实现它们。这可以使问题更容易处理,并允许你在每个步骤中进行测试和调试。
  3. 最后直接去推敲如何写代码。

那么下面就先来看两个简单的排序算法:

  • 冒泡排序
  • 选择排序

冒泡排序

介绍

从初始索引开始,当前索引与之后的索引两两比较,每比较完一次索引增加一次,每次从数组中找出最大值放在数组的后面去。

实现冒泡排序的关键步骤分析


  • 确定总共需要做几轮:数组的长度 - 1
  • 每轮比较几次:数组的长度 - i - 1  (i为当前的轮数 - 1)
  • 当前位置大于后一个位置则交换数据

详细图解

假设我们要将一个数组按升序排序,从数组的第一个数和第二个数开始进行比较;

我们先来看第一轮排序

第一轮比较的次数:3次 (也就是数组的长度4 - 0(当前轮数 - 1) - 1

接下来看第二轮排序:

   

第二轮比较的次数:2次 (也就是数组的长度4 - 1(当前轮数 - 1) - 1

那么第三轮比较的次数就为1次了。



该数组的长度为4,故而需要比较的轮数为:3次        (数组的长度 4 - 1)


由于冒泡排序的每一轮排序都会把一个最大或者最小的元素放在最后的位置,这个元素与前面所有的元素都比较过了,已经是确定的值,所以我们不再需要对它进行比较;所以每比较一轮,我们就少一个需要比较的元素。

代码部分

import java.util.Arrays;
 
public class BubbleSort {
    public static void main(String[] args) {
        //1.准备一个数组
        int[] arr = {5,2,3,1};
 
        //2.定义一个循环控制排几轮
        for(int i = 0;i < arr.length - 1;i++){
            //3.定义一个循环控制每轮比较几次
            for(int j = 0; j < arr.length - i - 1;j++){
                //判断当前位置的元素值,是否大于后一个位置的元素值,如果大则交换
                if(arr[j] > arr[j + 1]){
                    arr[j + 1] = arr[j] ^ arr[j + 1];
                    arr[j] = arr[j] ^ arr[j + 1];
                    arr[j + 1] = arr[j] ^ arr[j + 1];
                }
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}

运行结果:

选择排序

介绍

  • 每轮选择当前位置,开始找出后面的较小值(或较大值)与该位置交换。

比如第一轮比较:第一个元素分别与后面所有的元素进行比较,根据升序或降序进行交换。

选择排序的关键

  • 确定总共需要选择几轮:数组的长度 - 1
  • 控制每轮从以前位置为基准,与后面元素选择几次

还是以上一个数组为例子,

详细图解

第一轮比较了3次

第二轮比较了2次

第三轮就比较一次:

代码部分

import java.util.Arrays;
 
public class SelectionSort {
    public static void main(String[] args) {
        int[] arr = {5,1,3,2};
 
 
        for(int i = 0; i < arr.length - 1; i++){
 
            for(int j = i +1; j < arr.length; j++){
                if(arr[i] > arr[j]){
                    arr[i] = arr[i] ^ arr[j];
                    arr[j] = arr[i] ^ arr[j];
                    arr[i] = arr[i] ^ arr[j];
                }
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}

运行结果:


选择排序优化

对于选择排序,其实我们可以稍加优化。不再进行多次的元素交换,而改为每轮排序都只交换一次,也就是说,我们可以在后面的索引中找到最小值(或最大值)与当前索引位置的元素进行一次比较,然后作一次交换即可。

图解

以图解的形式演示

代码部分

import java.util.Arrays;
 
public class SelectionSort {
    public static void main(String[] args) {
        int[] arr = {5,1,3,2};
        for(int i = 0; i < arr.length - 1; i++){
            int minIndex = i;   //记录最小值的索引
            for(int j = i + 1; j < arr.length; j++){
                if(arr[j] < arr[minIndex]){
                    minIndex = j;
                }
            }
            if(arr[i] > arr[minIndex]){
                arr[i] = arr[i] ^ arr[minIndex];
                arr[minIndex] = arr[i] ^ arr[minIndex];
                arr[i] = arr[i] ^ arr[minIndex];
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}

运行结果:



同样的环境下,效率对比:

import java.util.Arrays;
import java.util.Random;
 
public class SelectionSort {
    public static void main(String[] args) {
        Random r = new Random();
        int[] arr = new int[100000];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = r.nextInt(1000000) + 1;
        }
 
        long time1 = System.currentTimeMillis();
        for(int i = 0; i < arr.length - 1; i++){
 
            for(int j = i +1; j < arr.length; j++){
                if(arr[i] > arr[j]){
                    arr[i] = arr[i] ^ arr[j];
                    arr[j] = arr[i] ^ arr[j];
                    arr[i] = arr[i] ^ arr[j];
                }
            }
        }
        long time2 = System.currentTimeMillis();
//        System.out.println(Arrays.toString(arr));
        System.out.println("执行时间:" + (time2 - time1) / 1000.0 + "s");
    }
}
import java.util.Arrays;
import java.util.Random;
 
public class SelectionSort {
    public static void main(String[] args) {
        Random r = new Random();
        int[] arr = new int[100000];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = r.nextInt(1000000) + 1;
        }
 
        long time1 = System.currentTimeMillis();
        for(int i = 0; i < arr.length - 1; i++){
            int minIndex = i;   //记录最小值的索引
            for(int j = i + 1; j < arr.length; j++){
                if(arr[j] < arr[minIndex]){
                    minIndex = j;
                }
            }
            if(arr[i] > arr[minIndex]){
                arr[i] = arr[i] ^ arr[minIndex];
                arr[minIndex] = arr[i] ^ arr[minIndex];
                arr[i] = arr[i] ^ arr[minIndex];
            }
        }
        long time2 = System.currentTimeMillis();
//        System.out.println(Arrays.toString(arr));
        System.out.println("执行时间:" + (time2 - time1) / 1000.0 + "s");
    }
}

END



目录
相关文章
|
5天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的优化算法及其应用
本文旨在探讨深度学习中常用的优化算法,包括梯度下降、动量方法、AdaGrad、RMSProp和Adam等。通过分析每种算法的原理、优缺点及适用场景,揭示它们在训练深度神经网络过程中的关键作用。同时,结合具体实例展示这些优化算法在实际应用中的效果,为读者提供选择合适优化算法的参考依据。
|
6天前
|
大数据 UED 开发者
实战演练:利用Python的Trie树优化搜索算法,性能飙升不是梦!
在数据密集型应用中,高效搜索算法至关重要。Trie树(前缀树/字典树)通过优化字符串处理和搜索效率成为理想选择。本文通过Python实战演示Trie树构建与应用,显著提升搜索性能。Trie树利用公共前缀减少查询时间,支持快速插入、删除和搜索。以下为简单示例代码,展示如何构建及使用Trie树进行搜索与前缀匹配,适用于自动补全、拼写检查等场景,助力提升应用性能与用户体验。
20 2
|
8天前
|
机器学习/深度学习 算法 物联网
探究操作系统的心脏:调度算法的演变与优化
本文旨在深入探讨操作系统中核心组件——调度算法的发展脉络与优化策略。通过分析从单任务到多任务、实时系统的演进过程,揭示调度算法如何作为系统性能瓶颈的解决关键,以及在云计算和物联网新兴领域中的应用前景。不同于传统摘要,本文将注重于概念阐释与实例分析相结合,为读者提供直观且全面的理解视角。
|
10天前
|
算法 搜索推荐 开发者
别再让复杂度拖你后腿!Python 算法设计与分析实战,教你如何精准评估与优化!
在 Python 编程中,算法的性能至关重要。本文将带您深入了解算法复杂度的概念,包括时间复杂度和空间复杂度。通过具体的例子,如冒泡排序算法 (`O(n^2)` 时间复杂度,`O(1)` 空间复杂度),我们将展示如何评估算法的性能。同时,我们还会介绍如何优化算法,例如使用 Python 的内置函数 `max` 来提高查找最大值的效率,或利用哈希表将查找时间从 `O(n)` 降至 `O(1)`。此外,还将介绍使用 `timeit` 模块等工具来评估算法性能的方法。通过不断实践,您将能更高效地优化 Python 程序。
27 4
|
20天前
|
机器学习/深度学习 算法
深度学习中的优化算法:从梯度下降到Adam
本文深入探讨了深度学习中的核心——优化算法,重点分析了梯度下降及其多种变体。通过比较梯度下降、动量方法、AdaGrad、RMSProp以及Adam等算法,揭示了它们如何更高效地找到损失函数的最小值。此外,文章还讨论了不同优化算法在实际模型训练中的表现和选择依据,为深度学习实践提供了宝贵的指导。
49 7
|
12天前
|
算法
基于ACO蚁群优化的UAV最优巡检路线规划算法matlab仿真
该程序基于蚁群优化算法(ACO)为无人机(UAV)规划最优巡检路线,将无人机视作“蚂蚁”,巡检点作为“食物源”,目标是最小化总距离、能耗或时间。使用MATLAB 2022a版本实现,通过迭代更新信息素浓度来优化路径。算法包括初始化信息素矩阵、蚂蚁移动与信息素更新,并在满足终止条件前不断迭代,最终输出最短路径及其长度。
|
15天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于PSO粒子群优化的GroupCNN分组卷积网络时间序列预测算法matlab仿真
本项目展示了一种结合粒子群优化(PSO)与分组卷积神经网络(GroupCNN)的时间序列预测算法。该算法通过PSO寻找最优网络结构和超参数,提高预测准确性与效率。软件基于MATLAB 2022a,提供完整代码及详细中文注释,并附带操作步骤视频。分组卷积有效降低了计算成本,而PSO则智能调整网络参数。此方法特别适用于金融市场预测和天气预报等场景。
|
16天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的优化算法
本文将探讨深度学习中的几种常见优化算法,包括梯度下降、动量方法、AdaGrad、RMSProp和Adam。这些算法在训练神经网络时发挥着重要作用,通过调整学习率和更新策略,能够显著提高模型的训练效率和性能。了解这些优化算法有助于更好地应用深度学习技术解决实际问题。
|
24天前
|
算法 Python
群智能算法:灰狼优化算法(GWO)的详细解读
在优化问题中,寻找最优解是核心目标。灰狼优化算法(GWO)受到自然界灰狼狩猎行为和社会等级结构的启发,通过模拟Alpha(头狼)、Beta(助手狼)、Delta(支配狼)和Omega(普通狼)的角色,高效搜索最优解。本文详细解析GWO的原理与步骤,并提供Python代码实现,帮助读者理解并应用这一算法。
|
24天前
|
算法 Python
群智能算法:【WOA】鲸鱼优化算法详细解读
本文详细解读了鲸鱼优化算法(WOA),这是一种受鲸鱼捕食行为启发的新兴群体智能优化算法,具有强大的全局搜索能力和快速收敛速度。文章分为五个部分,分别介绍了引言、算法原理、主要步骤、特点及Python代码实现。通过模拟鲸鱼的捕食行为,该算法能够在复杂的优化问题中找到全局最优解。
下一篇
无影云桌面