首页 > 编程语言 >插入排序Java版

插入排序Java版

时间:2023-05-19 09:13:47浏览次数:37  
标签:arr 遍历 Java int 插入排序 void 当前 public

插入排序

工作原理:

从头开始遍历数组,如果发现当前项比前一项小,说明当前项应该插到前面,交换一下即可。

利用双层for循环,第一层是遍历整个数组,第二层负责遍历当前所遍历到的位置之前的数组。

/**
 * @Author: 翰林猿
 * @Description: 插入排序
 **/
public class Insert {
    public Insert() {
    }
​
    public static <E extends Comparable<E>> void InsertSort(E[] arr) {
        for (int i = 0; i < arr.length; i++) {                  //遍历当前乱序的数组
            for (int j = i; j >= 1; j--) {                      //从i开始去遍历当前位置i之前的元素,且j不能是第一项(找到合适的位置插入)
                if (arr[j].compareTo(arr[j - 1]) < 0) {         //如果当前项比前一项小,说明当前项应该插到前面
                    swap(j, j - 1, arr);                        //交换当前项和前一项,从而实现插入
                } else {
                    break;
                }
            }
        }
    }
    //由于多次使用swap进行交换导致性能变差,我们可以优化一下,直接找到应该插入的地址,然后将后面的值各自往后覆盖一位,最后将值插到该插入的地方即可。
    public static <E extends Comparable<E>> void BetterInsertSort(E[] arr) {
        for (int i = 0; i < arr.length; i++) {                  //遍历当前乱序的数组
            E t = arr[i];                                       //用来暂存当前位置的值
            int j;                                              //提高作用域
            //为什么for循环采用这种写法,因为如果在for里才用if判断compareTo的话j已经-1了
            //如果if进不去j就会导致j多减几次,最后因为下标出错而覆盖出错。
            for (j = i; j >= 1 && t.compareTo(arr[j - 1]) < 0; j--) { //如果暂存的值比前一项小,说明当前项应该插到前面
                arr[j] = arr[j - 1];                                  //将前一项的值覆盖当前项(不需要交换,更快)
            }
            arr[j] = t;                                               //把刚刚保存好的值放到最后j停下的位置即可
        }
    }
​
    public static <E> void swap(int j, int beforej, E[] arr) {      //一个简单的交换算法
        E t = arr[j];
        arr[j] = arr[beforej];
        arr[beforej] = t;
    }
​
    public static void main(String[] args) {
        Integer[] arr = {1, 8, 9, 7, 3, 5, 6};
        Insert.BetterInsertSort(arr);
        for (int it : arr) {
            System.out.println(it);
        }
    }
}

标签:arr,遍历,Java,int,插入排序,void,当前,public
From: https://www.cnblogs.com/hanlinyuan/p/17413897.html

相关文章

  • JAVA学习之枚举类和注解
    之后的知识点都是一些小的细的碎的知识点的大杂烩,于是就选择每天都建一个新博客,去记录知识点了。枚举简单介绍:1.枚举对应英文(enumeration,简称enum)。2.枚举是一组常量的集合。3.可以理解为:枚举是一种特殊的类,里面只包含一组有限的特定的对象。首先尝试用已有知识解决需求:自......
  • Java编程的逻辑
    chapter3类的基础3.3代码的组织机制包范围可见性如果什么修饰符都不写,它的可见性范围就是同一个包内,同一个包内的其他类可以访问,而其他包内的类则不可以访问。声明为protected不仅表明子类可以访问,还表明同一个包内的其他类可以访问,即使这些类不是子类也可以。总结来说,可......
  • Java中==和equals的区别
    在Java中“==”和“equals()”都是用于比较两个对象是否相等,但是他们之间还是有着许多不同之处。两者的区别“==”是一个操作符,用于比较两个操作数的值是否相等。如果操作数为值类型,比较的是值是否相等,如果操作数为引用类型,比较的是地址值是否相等。“equals()”是一个定义在Ob......
  • 深入理解之JavaScript之call, apply, bind方法
    在JavaScript中,call、apply和bind是Function对象自带的三个方法,这三个方法的主要作用是改变函数执行时的上下文,再具体一点就是改变函数运行时的this指向。Function.prototype.call()call()方法调用一个函数,其具有一个指定的this值和多个参数(参数的列表)。fun.call(thisArg,a......
  • java面试题--Redis
    一、说一下redis的持久化机制原理?RDB文件:redisdatabase。存储的是某个时间点的数据库内容的快照,是结果。redis默认的持久化策略。落盘策略:使用SAVE或者BGSAVE命令。(1)SAVE:有主线程执行,会阻塞客户端。(2)BGSAVE:会fork出一个子进程,不会出现阻塞问题。子进程使用写时拷贝的策......
  • javascript小技巧(六)
    操作EXECL<scriptlanguage="javascript">functionjStartExcel(){varxls=newActiveXObject("Excel.Application");xls.visible=true;varnewBook=xls.Workbooks.Add;newBook.Worksheets.Add;newBook.Worksheets(1).Activa......
  • 使用java.text包格式化数字和日期
    TestFormat.javaimportjava.text.DateFormat;importjava.text.DecimalFormat;importjava.text.NumberFormat;importjava.text.SimpleDateFormat;importjava.util.Date;publicclassTestFormat{publicstaticvoidmain(String[]args){defaultNumberFor......
  • Java程序设计复习提纲(上:入门语法)
    目录上:基本语法与编译运行数据类型和关键字常用语法数组与字符串异常处理中:面向对象和类下:图形界面基本语法与编译运行java没有指针没有全局变量Java源代码文件的后缀名是".java"。编译后会生成一个或多个字节码文件,后缀名为".class"。Java的编......
  • Javaweb期末作品
    用户修改界面update.jsp<html><head><title>update</title><linkrel="stylesheet"href="css/updateUser.css"></head><bodystyle="margin:0100px"><divcla......
  • Java面向对象之构造方法
    方法重载Overload  1.概念:一个类中的一组方法 相同的方法名字 不同的参数列表 构成了方法重载参数的不同体现在 参数的个数 参数的类型 参数的顺序三个方面  2.作用:为了便于记忆和调用使得方法调用时更加的灵活  3.自己也可以设计方法重载   ......