当前位置: 首页 > news >正文

Java排序之直接插入排序、希尔排序、冒泡排序、快速排序(持续更新)

为什么80%的码农都做不了架构师?>>>   hot3.png

注:java排序我会用Integer数组进行演示,这样就纯粹的研究排序,如果使用别的类型来需要compareTo()方法进行对象大小比较,这样在一定的情况下会影响同学们的理解。

插入排序:直接插入排序、折半插入排序、希尔排序

交换排序:冒泡排序、快速排序。

直接插入排序

插入排序的原理是将一个数与一个有序的序列进行比较,然后再将其插入这个有序的序列中。所以第一次讲序列的前两个值进行比较进行排序,然后第三个值再与这个序列进行比较,直到结束。

private static void insertSort(Integer[] table) {
        
        for (int i = 1; i < table.length; i++) {
            int temp=table[i];
            int j;
            for (j = i-1; j>=0 && temp<table[j]; j--) {
                table[j+1]=table[j];
                    
            }
            table[j+1]=temp;
        }
    }

希尔排序

希尔排序,是将一个序列的长度/2,当作比较的距离叫做增量(取变量名为detal)。将i和i+detal的值进行比较,将如果i所处的位置值大于i+detal的值,两个就换位置。一次循环之后,再将detal/2,依次进行操作,知道detal=1,越接近1时,数组就会越趋于有序。

private static void shellSort(Integer[] table) {
        
        for (int detal = table.length/2; detal>0; detal=detal/2) {
            
            
            for (int i = detal; i < table.length; i++) {
                
                int temp=table[i];
                
                int j;
                
                for ( j = i-detal; j>=0 && temp<table[j]; j-=detal) {
                    table[j+detal]=table[j];
                }
                table[j+detal]=temp;
            }
            
        }
    }

冒泡排序

    冒泡排序的原理是遍历数组中的数据并在相邻的进行比较,如果当前位置i的值大于i+1的值,就换位置。如果当前位置的值小于i+1的值,就不变。这样每次循环都会确定最后以为的最大的数字。

    204022_oBAF_3523033.png

第一次遍历之后,就会确定数组最大的值在最后面。

第二次遍历的时候,就会确定数组中倒数第二个值在正确的位置(倒数第二位上)。

来吧,贴测试代码喽~

        Integer[] intArray={1,20,39,23,45,63,35,12,56,92,34,56,15};
        Integer temp=0;
        int len=intArray.length;
        for (int i = 0; i < len; i++) {
           
            for (int j = 0; j < len-i-1; j++) {
            
                if (intArray[j]>intArray[j+1]) {
                    temp=intArray[j];
                
                    intArray[j]=intArray[j+1];
                
                    intArray[j+1]=temp;
                
                }
            }
        }

解释一下:为什么是j < len-i-1?首先是关注“1”的问题,因为我写代码的问题,如果不-1会造成数组越界。

                 为什么要-i,刚才已经提到了,每一次遍历都会确定一个最大值,所以-i可以减少递归的次数。

快速排序:

因为冒泡排序,每次值的交换都会进行三次赋值,加入冒泡排序的第一个数据是最大值,那么第一次遍历,这个值就会移动length-1次,存在重复数据移动,快速排序算法是希望尽可能的减少这种重复的数据移动。

快速排序的基本思想:

在数据序列中选择一个值作为比较的基准值,每趟数据序列的两端开始交替进行。

以代码举例Integer[] intArray,将第一个值作为基准值取名为vot,两端i=0,j=intArray.length-1;

如果intArray[j]>=vot,那么没有任何操作,并且j--,继续从用intArray[j]与vot进行比较;

用vot和j比较,如果intArray[j]<=vot,那么intArray[j]就移动到i的位置上,并且i++;

并且下一次用i与vot比较,如果intArray[i]>vot,那么intArray[i]就移动到j的位置,并且j--,并在j那边进行比较;

如果intArray[i]<=vot,那么没有任何操作,并且i++,继续从用intArray[i]与vot进行比较;

直至i==j,第一次遍历结束,intArray[i]=vot;

这样结束下来,标准值vot左边都是小于自己的,右边都是大于自己的。再讲左边和右边分别看成一个集合再进行如此操作,当最后每个集合不可分割时,就结束了。

图示:

    为了让大家更好的了解,也是为了让我自己温习时能更好的理解,我画了一个图示。 

 

 

215417_4QlR_3523033.png

图中我把移动的数据以“”来表示,其实正常是不需要的,为什么要这样,是为了让大家理解的时候更加简单。因为整个数列里面,空的值都是无效的,最终都会被替换掉。

下面是是代码实例,注意这里while和if的用法,很强大,比我自己写的强的很多~自己根据理解写了一下,受益匪浅。

public static void main(String[] args) {
        Integer[] table={4,1,7,3,2,5,6};
        quickSort(table,0,table.length-1);
    }

    /**
    * @Title: quickSort
    * @Description: TODO(快速排序)
    * @param @param table  排序的数组
    * @param @param begin  开始排序的数组下标
    * @param @param end    结束排序的数组下标
    * @return void    返回类型
    * @author guojian 
    * @throws
    
    */
    private static void quickSort(Integer[] table, int begin, int end) {
        //判断比较的数组是否长度为1(数组长度逐步分解为1时,停止快速排序)
        if (begin<end) {
            int i=begin;
            int j=end;
            int vot=table[i];//设定标准值
            
            while(i<j){
                //判断标准值与j的大小,如果vot<=table[j],就一直执行j--操作。
                //如果大于,就将table[j]移动到i的位置上,并且i++,然后再从i端与vot进行比较
                while (i<j && vot <=table[j]) {
                    j--;
                }
                
                if (i<j) {
                    table[i++]=table[j];
                }
                //判断标准值与i的大小,参考上方注释
                while (i<j && table[i] <=vot){
                    i++;
                }
                if (i<j) {
                    table[j++]=table[i];
                }
                
            }
            table[i]=vot;
            quickSort(table,begin,j-1);//标准值前面的序列再进行排序
            quickSort(table,i+1,end);//标准值后面的序列再进行排序
        }
        
    }

 

 

 

转载于:https://my.oschina.net/WEguo/blog/1540099

相关文章:

  • 1-SDK开发初探-8266
  • Tornado异步阻塞解决方案
  • Ansible
  • Windows10 UWP开发 - 响应式设计
  • Hbase万亿级存储性能优化总结
  • linux 查看用户常用命令
  • RESTful API 设计指南
  • mysql 存储过程中使用游标中使用临时表可以替代数组效果
  • MAC Intellij IDEA 常用快捷键
  • day04Java语言基础+
  • 【安全牛学习笔记】vega
  • 关于Android Studio启动后自己的配置
  • 线性回归、岭回归和LASSO回归
  • 微信图片防盗链解决办法
  • LAMP架构讲解(续一)
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • Angular6错误 Service: No provider for Renderer2
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • JS笔记四:作用域、变量(函数)提升
  • mysql 数据库四种事务隔离级别
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • npx命令介绍
  • Spark RDD学习: aggregate函数
  • 从setTimeout-setInterval看JS线程
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 突破自己的技术思维
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ​什么是bug?bug的源头在哪里?
  • # C++之functional库用法整理
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • ()、[]、{}、(())、[[]]命令替换
  • (09)Hive——CTE 公共表达式
  • (3)llvm ir转换过程
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (javascript)再说document.body.scrollTop的使用问题
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (算法)Game
  • .axf 转化 .bin文件 的方法
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET Core中Emit的使用
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • /dev/sda2 is mounted; will not make a filesystem here!
  • @Autowired 与@Resource的区别
  • @Service注解让spring找到你的Service bean
  • [ vulhub漏洞复现篇 ] Apache Flink目录遍历(CVE-2020-17519)
  • [ 云计算 | AWS ] 对比分析:Amazon SNS 与 SQS 消息服务的异同与选择