常用排序:冒泡排序与快速排序详解,看完这篇就够了!风马博客

常用排序:冒泡排序与快速排序详解。

在排序算法中,冒泡排序和快速排序可以算是排序算法入门必会的两种排序了,今天和大家来分析一下如何快速理解并掌握这两种排序。首先冒泡排序是初学者最常用的排序,所以我们先来详解下冒泡排序。

1.冒泡排序

冒泡排序,看字面意义就是有大泡泡和小泡泡在水中同时上浮,而大的泡泡就上升的快,小的泡泡就上升的相对较慢,从而产生了一定的速度差,这就产生了大的泡泡在小的泡泡上面,也就是按从一定的大小顺序排好了顺序。当然,这里的比喻和冒泡排序有点不同,冒泡排序是针对数值排序,且算法是有稍微的差别。

这里我们使用大家喜欢的java语言来示范,我们取出20个10以内的数字:

int[] sortInts = new int[20];
for (int i = 0; i < 20; i++) {
    int random = (int) (Math.random() * 10);
    sortInts[i] = random;
}

例如我们得到以下数值:

2、8、6、6、6、9、5、1、9、2、7、3、9、8、9、0、9、2、0、6、

下面要对这些数字进行冒泡排序,我们使用的方法是,两两对比,拿数组第一个数值对比第二个数值并把较大的替换到后面,然后是第一个数值对比第三个数值把较大的替换到后面,然后是第一个数值对比第四个数值把较大的替换到后面,直到对比到最后一个,第一轮对比结束。

第一轮对比结果:

0、8、6、6、6、9、5、2、9、2、7、3、9、8、9、1、9、2、0、6、

不难看出,第一个数值我们已经排序完成了,后面进行第二轮排序,我们拿第二个数值开始对比,第二个数值对比第三个数值并把较大的替换到后面,第二个数值对比第四个数值并把较大的替换到后面,直到对比到最后一个,第二轮对比结束。

第二轮对比结果:

0、0、8、6、6、9、6、5、9、2、7、3、9、8、9、2、9、2、1、6、

后面延续这样的对比最终排序完成。上面是理解层面的解释,下面给出代码实现:

    public static void main(String args[]){
        int[] sortInts = new int[20];
        for (int i = 0; i < 20; i++) {
            int random = (int) (Math.random() * 10);
            sortInts[i] = random;
        }
        printArrays(sortInts);
        bubbleSort(sortInts);
    }

    //冒泡排序
    private static void bubbleSort(int[] integers){
        for(int i = 0; i<integers.length-1; i++){
            for(int j=i; j<integers.length; j++){
                if(integers[i] > integers[j]){
                    int temp = integers[i];
                    integers[i] = integers[j];
                    integers[j] = temp;
                }
            }
        }
        printArrays(integers);
    }
    
    private static void printArrays(int[] a) {
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i] + "、");
        }
    }

冒泡排序结果:

0、0、1、2、2、2、3、5、6、6、6、6、7、8、8、9、9、9、9、9、

 

注:本文来自风马博客原创,如有不对之处请留言指出。

2.快速排序

快速排序是冒泡排序的一种优化,稍微比冒泡排序要难理解一点点,快速排序的优点就是快速,缺点是不稳定。

快速排序的原理:

1.取数组中一个数值作为基数.

2.把大于此基数的换到数组的右侧,小于此基数的换到数组的左侧.

3.对换基数与中间数值的位置

4.重复2操作,直到数值数量为1

不难看出4步骤用到了递归方法,快速排序java实现代码如下:

 public static void main(String args[]){
        int[] sortInts = new int[20];
        for (int i = 0; i < 20; i++) {
            int random = (int) (Math.random() * 10);
            sortInts[i] = random;
        }
        printArrays(sortInts);
        fastSort(sortInts,0,sortInts.length-1);
    }

    //快速排序
    private static void fastSort(int[] integers,int left,int right){

        if(left>right){
            return;
        }

        int base = integers[left];
        int i = left;
        int j = right;
        while(i < j){

            while (integers[j]>=base && i<j){
                j--;
            }

            while (integers[i]<=base && i<j){
                i++;
            }

            int temp = integers[i];
            integers[i] = integers[j];
            integers[j] = temp;
        }

        integers[left] = integers[i];
        integers[i] = base;

        fastSort(integers,left,i-1);
        fastSort(integers,i+1,right);

        printArrays(integers);
    }

    private static void printArrays(int[] a) {
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i] + "、");
        }
    }

快速排序输出结果如下:

2、5、0、0、4、6、4、2、5、8、2、5、2、0、8、2、1、8、1、7、
0、0、0、1、1、2、4、2、5、8、2、5、2、6、8、2、4、8、5、7、
0、0、0、1、1、2、4、2、5、8、2、5、2、6、8、2、4、8、5、7、
0、0、0、1、1、2、4、2、5、8、2、5、2、6、8、2、4、8、5、7、
0、0、0、1、1、2、4、2、5、8、2、5、2、6、8、2、4、8、5、7、
0、0、0、1、1、2、4、2、5、8、2、5、2、6、8、2、4、8、5、7、
0、0、0、1、1、2、2、2、2、2、4、5、8、6、8、5、4、8、5、7、
0、0、0、1、1、2、2、2、2、2、4、5、8、6、8、5、4、8、5、7、
0、0、0、1、1、2、2、2、2、2、4、5、8、6、8、5、4、8、5、7、
0、0、0、1、1、2、2、2、2、2、4、5、8、6、8、5、4、8、5、7、
0、0、0、1、1、2、2、2、2、2、4、4、5、6、8、5、8、8、5、7、
0、0、0、1、1、2、2、2、2、2、4、4、5、5、5、6、8、8、8、7、
0、0、0、1、1、2、2、2、2、2、4、4、5、5、5、6、8、8、8、7、
0、0、0、1、1、2、2、2、2、2、4、4、5、5、5、6、7、8、8、8、
0、0、0、1、1、2、2、2、2、2、4、4、5、5、5、6、7、8、8、8、
0、0、0、1、1、2、2、2、2、2、4、4、5、5、5、6、7、8、8、8、
0、0、0、1、1、2、2、2、2、2、4、4、5、5、5、6、7、8、8、8、
0、0、0、1、1、2、2、2、2、2、4、4、5、5、5、6、7、8、8、8、
0、0、0、1、1、2、2、2、2、2、4、4、5、5、5、6、7、8、8、8、
0、0、0、1、1、2、2、2、2、2、4、4、5、5、5、6、7、8、8、8、
0、0、0、1、1、2、2、2、2、2、4、4、5、5、5、6、7、8、8、8、

 

总结:冒泡排序和快速排序为入门排序,需理解后再尝试编写,希望读此博客者有所收获。

本文来自风马博客,Renfr原创,如有不对之处请留言指出。

热门文章

暂无图片
编程学习 ·

Python:% 和 .format() 的使用

目录基本的格式化值转换填充和对齐字符串截断长串结合截断与填充数字填充数字带符号的数字有名字的占位符Getitem 和 Getattr日期时间参数化的格式自定义对象多年来,Python 具有出色的字符串格式化程序,但是有关它们的文档在理论和技术上都太过严格了。通过此站点,我们尝试通…
暂无图片
编程学习 ·

坚强奋斗的后浪们,后浪们的逆风翻盘之路。

逆风5.4日B站播出了后浪,视频伴随着激情澎湃的音乐、华丽无比的台词、精英人士的代言,可以说很振奋人心。但是观看后,网上却有着两种不同的声音,分别是乐观与悲观。当然伴随着疫情肆虐,悲观的声音反而是最响亮。90后们更是看的焦躁不安、时逢逆风,如何翻盘? 逆风论点:通…
暂无图片
编程学习 ·

服务器使用Nginx部署Springboot项目(jar包)

部署SpringBoot项目到后台Nginx实现多项目反向代理1,将java项目打成jar包2.准备工具3.将jar包传入服务器3.使用Xshell运行jar包4.下载安装nginx5.配置nginx.conf6通过域名访问(成功) 1,将java项目打成jar包 这里我用到的是maven工具这里有两个项目,打包完成后一个为demo.jar,另…
暂无图片
编程学习 ·

电解电容的遇到的问题

目前板子遇到一个问题: 电解电容串在语音的输出端(470的电容)出现电容两边的电压差比较大,正极为5.68V,负极输出为1.34V。由于电压达不到要求,系统不能正常工作 百度看到一些相关描述,怀疑有关系。将电解电容更换后恢复正常。 百度问题: 电解电容的电压是什么意思?必须…
暂无图片
编程学习 ·

nginx+tomcat 配置证书

nginx 配置证书 tomcat 配置文件说明#user nobody; worker_processes 1;#error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info;#pid logs/nginx.pid;events {worker_connections 1024; }http {include mime.typ…
暂无图片
编程学习 ·

Spring依赖注入:@Autowired,@Resource和@Inject区别与实现原理

注入实现方式@Autowired是spring框架提供的实现依赖注入的注解,主要支持在set方法,field,构造函数中完成bean注入,注入方式为通过类型查找bean,即byType的,如果存在多个同一类型的bean,则使用@Qualifier来指定注入哪个beanName的bean。与JDK的@Resource的区别:@Resourc…
暂无图片
编程学习 ·

四.面向对象

解释说明姓名 职位 动作张三 程序员 打卡,开会李四 前台 打卡,开会王五 财务 打卡,开会用表格表示一组数据,表结构理解为类,每一行数据对应一个对象; 姓名、职位相当于类中的属性; 动作早会相当于类中的方法; 面向过程:执行者思维,对于简单问题,比如开车步骤 按照12…
暂无图片
编程学习 ·

笔记:R输入文件数据处理txt, csv,画饼图

R输入文件数据处理txt, csv, xlsx 数据处理 1)获取文件类型 parts = strsplit(infile, split=".", fixed = TRUE) ftype = parts[[1]][length(parts[[1]])]2)根据文件类型选择输入方式 if (ftype == "csv"){loandata<<-data.frame(read.csv(infile…
暂无图片
编程学习 ·

C#读取csv数据隔行读取异常问题

##CSV隔行读取 读取代码 StreamReader sd = new StreamReader(SavePath, Encoding.Default); sting stringLine=""; while (sd.ReadLine()!=NULL)//此处已读取一行,但未赋值{stringLine = sd.ReadLine(); }应修改为 while (sd.Peek()>0)//此处已读取一行,但未赋…
暂无图片
编程学习 ·

Java 语言中关键字“static”的理解和应用详解

接触Java编程语言的初学者们,都是熟悉static这个关键词的,至少混个脸熟了已经。涉及到它的概念、或解释,我们都是知道它表示“静态”、甚至了解“静态存储区”。它可以应用到:属性 方法 代码块 还可以做“静态导入” 内部类 一、static修饰的属性,我们亦称之为“静态变量”…
暂无图片
编程学习 ·

Java的变量与常量

变量与常量变量的定义变量的初始化常量static final(类常量) 变量的定义大多数程序设 计语言相比,Java 中“ 字母” 和“ 数字” 的范围更大。字母包括’A’ ~ ’Z’、 ‘a’ ~ ‘z’、’_’、’$’,或在某种语言中表示字母的任何 Unicode 字符。希腊人可以用π 。同样, 数…
暂无图片
编程学习 ·

数据库语句和数据库表常用的操作命令

Mysql的启动与关闭启动 net start mysql关闭 net stop mysql显示当前服务器版本 SELECT NERSION();显示当前的日期 SWLECT NOW();显示当前用户 SELECT USER(); 数据库语句(DDL)查看数据库 show databases;创建数据库 create database demo;查看警告信息 show warnings;查…
暂无图片
编程学习 ·

RetinaNet(基于resnet50和fpn)的tensorboard网络架构图

采用网络的backbone部分,为了能运行tensorboard,所以必须要是完整的网络,所以结尾采用提取有效特征层P7(tensor类型),进行Flatten拉平,然后接了一层全连接,使用虚拟数据进行空跑,才能进入tensorboard。 Keras和TF是可以互通,使用tf.keras更加方便,中间可以嵌套tf,使…