排序算法--直接插入排序(Java)

直接插入排序算法

一、学习资料:

简书–八大排序算法
博客–八大排序算法

二、排序过程及代码
package com.lxf.sort;

import java.util.Arrays;
import java.util.Random;

/**
 * 直接排序算法
 */
public class DirectSort {

    /*
     * 直接排序
     * 从第二位开始,每一位都和前面的一位比较,如果小于前一位,则和前一位交换位置,一直比到最后一位
     * 例如有这么六个数(下面|左边是已排序,右边是未排序):7 3 1 6 2 5
     * 第一次遍历:3 7| 1 6 2 5
     * 第二次遍历:1 3 7| 6 2 5
     * 第三次遍历:1 3 6 7| 2 5
     * 第四次遍历:1 2 3 6 7| 5
     * 第五次遍历:1 2 3 5 6 7| (完成)
     * 100000位数字排序花费时间(三次测试):17234ms 17911ms 18653ms
     * 平均值:17932ms
     * @param nums
     * @return
     */
    public static int[] directSort1(int[] nums){
        //循环整个数组
        for (int i = 0; i < nums.length; i++) {
            //将当前值与当前值之前的值比较,若小于之前的值则换位
            for (int j = i-1; j >=0; j--) {
                if(nums[j+1]<nums[j]){
                    int temp=nums[j+1];
                    nums[j+1]=nums[j];
                    nums[j]=temp;
                }
            }
        }
        return  nums;
    }
    /* 
     * 直接排序优化
     * 相对与比较一位交换一次位置,改为比这一位小的往后移,这一位最后插入
     * 100000位数字排序花费时间(三次测试):12716ms 14275ms  13086ms
     * 平均值:13359ms
     * @param nums
     * @return
     */
    public static int[] directSort2(int[] nums){
        //循环整个数组
        for (int i = 0; i < nums.length; i++) {
            //将当前值与当前值之前的值比较,若小于之前的值则前一位后移,最后当前值插入
            for (int j = i-1; j >=0; j--) {
                //获取当前值
                int temp=nums[i];
                //每一位与当前值比较
                if(nums[j]<temp){
                    nums[j+1]=nums[j];
                }
                nums[j]=temp;
            }
        }
        return  nums;
    }
    public static void main(String[] args) {
        //获取一个数字字符串
        StringBuilder stringBuilder = new StringBuilder();
        Random random = new Random();
        for (int i = 0; i < 100000; i++) {
            stringBuilder.append(random.nextInt(500)+",");
        }
        //去掉最后一个,
        stringBuilder.setLength(stringBuilder.length()-1);
        //获取整数数组
        String[] splits= stringBuilder.toString().split(",");
        int[] nums = Arrays.stream(splits).mapToInt(Integer::valueOf).toArray();
        //获取开始时间
        long  start = System.currentTimeMillis();
        System.out.println("start = " + start);
        //直接排序算法
        int[] ints = directSort2(nums);
        //获取执行完的时间
        long end = System.currentTimeMillis();
        System.out.println("end = " + end);
        //计算执行时间
        long sub=end-start;
        System.out.println("花费时间="+sub);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值