手把手教你搞懂冒泡排序和选择排序

 更新时间:2021年07月15日 16:24:31   作者:小胖java攻城狮  
这篇文章主要介绍了java数组算法例题代码详解(冒泡排序,选择排序),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

冒泡排序

原理:

从头(左边)开始比较每一对相邻的元素,如果第1个比第2个大,就交换它们的位置,执行完一轮后,最末尾(最右边)就是最大的元素。

举例:

假设存在数组nums={6,8,2,9,4},对nums数组进行排序

在这里插入图片描述

从左往右开始,拿出两个元素进行对比,出现两种情况:

1.左边元素 <= 右边元素,不变

2.左边元素 > 右边元素,交换他们的位置(这里可以写成>=吗?不行,因为会造成排序不稳定)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

接下来就是新的一轮排序,逻辑跟上图的流程是一样的,不同的是会将最大的元素排除在外,不用进行比较。

手撕代码:

/*
没有使用过优化策略的冒泡排序
 */
public class BubbleSort1 {
    //测试数据
    public static int[] nums = {4,1,7,11,9,55};
    //main方法
    public static void main(String[] args){
        //这个for循环每循环完一次,end--,说明就把最大的元素给选出来了
        for (int end = nums.length - 1; end > 0; end--){
            for (int begin = 1; begin <= end; begin++){
                if(nums[begin] < nums[begin - 1]){    //每当发现左边的元素大于右边的元素
                    //交换元素
                    int temp = nums[begin];
                    nums[begin] = nums[begin - 1];
                    nums[begin - 1] = temp;
                }
            }
        }
        //打印验证结果
        for(int num : nums){
            System.out.print(num+"_");
        }
    }
}

时间复杂度为O(n^2),也就是n的平方,不过这是平均时间复杂度

存在最好时间复杂度O(n),那就是数组本来就有序,也就是说只扫描一遍就行了。

优化策略:

由于存在部分有序的情况,例如nums数组为{8,5,2,10,11,12},也就是说10,11,12都没有比较的必要了

优化代码:

/*
使用过优化策略的冒泡排序
 */
public class BubbleSort1 {
    public static int[] nums = {4,1,7,11,9,55};
    public static void main(String[] args){
        for (int end = nums.length - 1; end > 0; end--){
            int sortIndex = 1;  //记录最后一次交换位置
            for (int begin = 1; begin <= end; begin++){
                if(nums[begin] < nums[begin - 1]){
                    int temp = nums[begin - 1];
                    nums[begin - 1] = nums[begin];
                    nums[begin] = temp;
                    sortIndex = begin;
                }
                end = sortIndex;
            }
        }
        for(int num : nums){
            System.out.print(num+"_");
        }
    }
}

选择排序

原理:

从数组中找到最大的元素,然后与末尾(最右边)的元素交换位置,执行完一轮后,末尾(最右边)的那个元素就是最大的元素。

举例:

假设存在数组nums={5,8,1,9,3},对nums数组进行排序,准备一个maxIdex代表当前最大元素的下标

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

接下来就是新的一轮排序,逻辑跟上图的流程是一样的,不同的是会将最大的元素排除在外,不用进行比较。

手撕代码:

/**
 * 选择排序
 */
public class SelectionSort {
    //测试数据
    private static int[] nums = {6,3,2,8,9};
    //main方法
    public static void main(String[] args){
        //这个for循环每循环完一次,end--,说明就把最大的元素给选出来了
        for(int end = nums.length - 1; end > 0; end--){
            int maxIndex = 0;   //假设下标0是数组中最大元素
            for(int begin = 1; begin <= end; begin++){  //从左往右开始比较
                if(nums[maxIndex] < nums[begin]){   //发现存在一个元素大于假设最大元素
                    maxIndex = begin;   //更改最大元素索引
                }
            }
            //最右边一个元素和最大值元素交换位置
            int temp = nums[maxIndex];
            nums[maxIndex] = nums[end];
            nums[end] = temp;
        }
        //打印结果
        for(int num : nums){
            System.out.print(num+"_");
        }
    }
}

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注脚本之家的更多文章!

相关文章

  • 基于Java语言在窗体上实现飞机大战小游戏的完整步骤

    基于Java语言在窗体上实现飞机大战小游戏的完整步骤

    这篇文章主要给大家介绍了基于Java语言在窗体上实现飞机大战小游戏的完整步骤,文中通过图文以及实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-02-02
  • Java  Object类中的常用API介绍

    Java  Object类中的常用API介绍

    这篇文章主要介绍了Java  Object类中的常用API介绍,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-11-11
  • 详解使用Spring Boot开发Web项目

    详解使用Spring Boot开发Web项目

    这篇文章主要介绍了详解使用Spring Boot开发Web项目,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-04-04
  • Java 基础之内部类详解及实例

    Java 基础之内部类详解及实例

    这篇文章主要介绍了 Java 基础之内部类详解及实例的相关资料,需要的朋友可以参考下
    2017-03-03
  • JavaMail实现发送邮件功能

    JavaMail实现发送邮件功能

    这篇文章主要为大家详细介绍了JavaMail实现发送邮件功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • Java十大经典排序算法的实现图解

    Java十大经典排序算法的实现图解

    Java常见的排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。本文详解介绍Java十大十大经典排序算法的实现以及图解,需要的可以参考一下
    2022-03-03
  • 详解Java 中的三种代理模式

    详解Java 中的三种代理模式

    代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;这篇文章主要介绍了Java 中的三种代理模式,需要的朋友可以参考下
    2018-08-08
  • SpringBoot使用EmbeddedDatabaseBuilder进行数据库集成测试

    SpringBoot使用EmbeddedDatabaseBuilder进行数据库集成测试

    在开发SpringBoot应用程序时,我们通常需要与数据库进行交互,为了确保我们的应用程序在生产环境中可以正常工作,我们需要进行数据库集成测试,在本文中,我们将介绍如何使用 SpringBoot 中的 EmbeddedDatabaseBuilder 来进行数据库集成测试
    2023-07-07
  • Java postgresql数组字段类型处理方法详解

    Java postgresql数组字段类型处理方法详解

    这篇文章主要介绍了Java postgresql数组字段类型处理方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • JAVA对称加密算法PBE定义与用法实例分析

    JAVA对称加密算法PBE定义与用法实例分析

    这篇文章主要介绍了JAVA对称加密算法PBE定义与用法,结合实例形式分析了JAVA对称加密算法PBE的概念、原理、定义及使用方法,需要的朋友可以参考下
    2019-09-09

最新评论