插入排序(Java)

复制代码
所谓插入排序法,就是检查第i个数字,
如果在它的左边的数字比它大,进行交换,
这个动作一直继续下去,直到这个数字的左边数字比它还要小,就可以停止了。
插入排序法主要的回圈有两个变数:
i和j,每一次执行这个回圈,就会将第i个数字放到左边恰当的位置去。
二、算法描述
 1、从第一个元素开始,该元素可以认为已经被排序。
 2、取出下一个元素,在已经排序的元素序列中从后向前扫描。
 3、如果该元素(已排序)大于新元素,则将该元素移到下一位置。
 4、重复步骤3,直到找到已排序的元素小于或者大于新元素的位置。
 5、将新元素插入到该位置。
 6、重复步骤2。
三、效率分析
如果目标是把n个元素的序列升序排列,那么采用插入排序存在最好情况和最坏情况如下。
最好情况:序列已经是升序排列了,在这种情况下,需要进行的比较操作需(n-1)次即可。
最坏情况:序列是降序排列,那么此时需要进行的比较共有n(n-1)/2次。
直接插入排序属于稳定的排序,最坏时间复杂度为O(n^2),
最好时间复杂度为O(n),空间复杂度为O(1)。
插入排序的赋值操作是比较操作的次数加上(n-1)次。
因此,插入排序不适合对于数据量比较大的排序应用。
插入排序是稳定排序

算法实现:

java 复制代码
package com.feixiang.platform.stu.math.sorting;

/**
 * Created with IntelliJ IDEA.
 * Description: 插入排序
 * @PackageName com.feixiang.platform.stu.math.sorting
 * @Author: ldwtxwhspring
 * @Date: 2020-05-22 下午1:01
 * @Version: 1.0
 */
@SuppressWarnings("DuplicatedCode")
public class InsertSort {

    /**
     * 插入排序 升序
     * @param array [array]
     * @return void
     * @author dwli
     * @date 2020/5/22 下午5:30
     */
    public static void insertSort(int[] array){
        for(int i=1;i<array.length;i++){
            //定义插入数:
            int insertPointValues = array[i];

            //定义插入点:
            int insertPoint = i-1;

         while (insertPoint>=0 && insertPointValues<array[insertPoint]){
             //插入点值后移
            array[insertPoint+1] = array[insertPoint];
            //插入点标记前移
             insertPoint--;
         }
            //把插入值放到指定位置
            array[insertPoint+1] = insertPointValues;
        }
    }


    /**
     * 插入排序 降序
     * @param array [array]
     * @return void
     * @author dwli
     * @date 2020/5/22 下午5:40
     */
    public static void insertSortDesc(int[] array){
        for(int i=1;i<array.length;i++){
            //定义插入数:
            int insertPointValues = array[i];

            //定义插入点:
            int insertPoint = i-1;

            while (insertPoint>=0 && insertPointValues>array[insertPoint]){
                //插入点值后移
                array[insertPoint+1] = array[insertPoint];
                //插入点标记前移
                insertPoint--;
            }
            //把插入值放到指定位置
            array[insertPoint+1] = insertPointValues;
        }
    }

    /**
     * 自定义选择排序类型,
     * @param array
     * @param sortType 该值只能是布尔值,true 升序 false 降序
     * @return void
     * @author dwli
     * @date 2020/5/22 下午5:43
     */
    public static void insertSort(int[] array,boolean sortType){
        for(int i=1;i<array.length;i++){
            //定义插入数:
            int insertPointValues = array[i];

            //定义插入点:
            int insertPoint = i-1;

            while ((insertPoint >= 0) && (sortType? (insertPointValues > array[insertPoint]):(insertPointValues < array[insertPoint]))){
                //插入点值后移
                array[insertPoint+1] = array[insertPoint];
                //插入点标记前移
                insertPoint--;
            }
            //把插入值放到指定位置
            array[insertPoint+1] = insertPointValues;
        }
    }


    /**
     * 内部引用方法,实现数组转字符串,达到toString效果,类同重写tostring
     * */
    private static String arraytoString(int[] objects){
        StringBuilder sb = new StringBuilder();
        sb.append("[ ");
        for(Object o:objects){
            sb.append(String.valueOf(o)).append(",");
        }
        //删除多余追加的,
        sb.deleteCharAt(sb.length()-1);
        sb.append(" ]");
        return sb.toString();
    }

    public static void main(String[] args) {
        int[] array = new int[]{44,22,31,2,55,92,1,34,332,0,2,44};
        insertSort(array);
        System.out.println(arraytoString(array));
        insertSortDesc(array);
        System.out.println(arraytoString(array));
        int[] array1 = new int[]{44,22,31,2,55,92,1,34,332,0,2,44};
        insertSort(array1,true);
        System.out.println(arraytoString(array1));
        int[] array2 = new int[]{44,22,31,2,55,92,1,34,332,0,2,44,1};
        insertSort(array2,false);
        System.out.println(arraytoString(array2));
    }
}
相关推荐
SimonKing1 小时前
震惊:怎么回事,opencode一轮对话耗尽免费额度
java·后端·程序员
装不满的克莱因瓶1 小时前
【SpringAI Alibaba】ReactAgent响应SSE实时流式传输案例实战
java·人工智能·ai·sse·springai
杨凯凡1 小时前
Spring Boot 文件上传怎么做才安全?流式落盘、路径校验与数据库一致性实战
java·spring boot·文件上传·后端安全·数据库一致性
这个昵称不容易2 小时前
旅游管理系统的设计与实现(SpringBoot + MySQL + Vue 前后端分离)
java·springboot·毕设
Rain的Java大神之路2 小时前
LeetCode 37 解数独面试攻略:回溯 + 位掩码 + MRV,从暴力到毫秒级求解
java·后端·leetcode
NEFU_Jyj2 小时前
贝尔数(组合数学)
算法
希和20272 小时前
C语言程序设计题|有序数组插入数字冒泡排序
c语言·数据结构·算法
Pniubi3 小时前
力扣73 矩阵置零
算法·leetcode·矩阵
天天被压力3 小时前
【A股分钟级高频数据完全手册 #11】券商实时行情数据接口:实时交易(券商源)接入与字段
java·人工智能·python
天天被压力3 小时前
【A股分钟级高频数据完全手册 #12】股票五档盘口数据接口:买卖五档实时盘口解析
java·人工智能·python