插入排序

插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。

插入排序法思想:

插入排序(Insertion Sorting)的基本思想是:

把n个待排序的元素看成为一个有序表和一个无序表,

开始时有序表中只包含一个元素无序表中包含有n-1个元素,

排序过程中每次从无序表中取出第一个元素,

把它的排序码依次与有序表元素的排序码进行比较,

将它插入到有序表中的适当位置,使之成为新的有序表。

package com.zx.ds.ds0731;

//插入排序
import java.util.Arrays;

public class InsertSort {

    public static void main(String[] args) {
        int array[]={3,2,4,1};

        System.out.println("before sort: ");
        System.out.println(Arrays.toString(array));

        /**
         * 3 2 4 1
         *
         * 2 3 4 1
         *
         * 2 3 4 1
         *
         * 1 2 3 4
         */

        //使用逐步推导的方式实现

        //从arrray[1]开始插入 前面只有array[0]
        //和array[0]进行比较 array[1]<array[0] 将array[0]后移  array[0]=insertVal
        int insertVal=array[1];
        int insertIndex=1-1;

        while(insertIndex>=0&&insertVal<array[insertIndex]){
            array[insertIndex+1]=array[insertIndex];
            insertIndex--;
        }
        array[insertIndex+1]=insertVal;
        System.out.println("1: ");
        System.out.println(Arrays.toString(array));

        insertVal=array[2];
        insertIndex=2-1;
        while(insertIndex>=0&&array[insertIndex]>insertVal){
            array[insertIndex+1]=array[insertIndex];
            insertIndex--;
        }
        array[insertIndex+1]=insertVal;
        System.out.println("2: ");
        System.out.println(Arrays.toString(array));

        insertVal=array[3];
        insertIndex=3-1;
        while(insertIndex>=0&&array[insertIndex]>insertVal){
            array[insertIndex+1]=array[insertIndex];
            insertIndex--;
        }
        array[insertIndex+1]=insertVal;
        System.out.println("3: ");
        System.out.println(Arrays.toString(array));

        System.out.println("after sort: ");
        System.out.println(Arrays.toString(array));
    }
}

//
before sort: 
[3, 2, 4, 1]
1: 
[2, 3, 4, 1]
2: 
[2, 3, 4, 1]
3: 
[1, 2, 3, 4]
after sort: 
[1, 2, 3, 4]

 使用for循环简化代码

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

public class InsertSort2 {

    public static void sort(int array[]) {

        int insertval = 0;
        int insertIndex = 0;

        // 给insertVal 找到插入的位置
        // 说明
        // 1. insertIndex >= 0 保证在给insertVal 找插入位置,不越界
        // 2. insertVal < arr[insertIndex] 待插入的数,还没有找到插入位置
        // 3. 就需要将 arr[insertIndex] 后移
        for (int i = 1; i < array.length; i++) {

            insertIndex = i - 1;
            //待插入的数
            insertval = array[i];

            while (insertIndex >= 0 && array[insertIndex] > insertval) {
                array[insertIndex + 1] = array[insertIndex];
                insertIndex--;
            }

            // 当退出while循环时,说明插入的位置找到, insertIndex + 1
            // 这里我们判断是否需要赋值
            if(insertIndex+1!=i){
                array[insertIndex + 1] = insertval;
            }
            //System.out.println("---"+i+"---");
            //System.out.println(Arrays.toString(array));

        }
    }

    //降序
    public static void sort2(int array[]) {

        int insertval = 0;
        int insertIndex = 0;

        for (int i = 1; i < array.length; i++) {
            insertIndex = i - 1;
            insertval = array[i];
            while (insertIndex >= 0 && array[insertIndex] < insertval) {
                array[insertIndex + 1] = array[insertIndex];
                insertIndex--;
            }
            array[insertIndex + 1] = insertval;
            //System.out.println("---"+i+"---");
            //System.out.println(Arrays.toString(array));

        }
    }

    public static void main(String[] args) {
        int array[] = {3, 2, 4, 1};

        System.out.println("before sort: ");
        System.out.println(Arrays.toString(array));

        sort(array);

        System.out.println("after sort: ");
        System.out.println(Arrays.toString(array));

        sort2(array);
        System.out.println("after sort2: ");
        System.out.println(Arrays.toString(array));

        int big[] = new int[80000];
        for (int i = 0; i < big.length; i++) {
            big[i] = (int) (Math.random() * 8000000);
        }

        Date date = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateToStr = simpleDateFormat.format(date);
        System.out.println("before sort: " + dateToStr);

        sort(big);

        Date date2 = new Date();
        SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateToStr2 = simpleDateFormat2.format(date2);
        System.out.println("after sort: " + dateToStr2);

    }
}

//
before sort: 
[3, 2, 4, 1]
after sort: 
[1, 2, 3, 4]
after sort2: 
[4, 3, 2, 1]
before sort: 2020-07-31 21:42:48
after sort: 2020-07-31 21:42:50
排序算法的比较
排序法平均时间最差情形稳定度额外空间备注80000随机数排序时间(s)
冒泡O(n²)O(n²)稳定O(1)n小时较好13
选择O(n²)O(n²)不稳定O(1)n小时较好4
插入O(n²)O(n²)稳定O(1)大部分已排序时较好2
       
       
       
       
       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值