• 13.插入排序--直接插入排序(简单插入排序)


    基本思想:

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

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

    排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,

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

    缺点:

    当需要插入的数是较小的数时,后移的次数明显增多,对效率有影响

    import java.util.Arrays;
    
    /**
     * 插入排序
     */
    public class InsertSort {
        private static int[] insertSort(int[] arr) {
            int length = arr.length;
            int tempIndex = 0;
            int insertVal = 0;
            for (int i = 1; i < length; i++) {
                insertVal = arr[i];
                if (insertVal>arr[0]){
                    //从第一个开始找
                    for (int j = 0; j < i; j++) {
                        if (insertVal>arr[j]){
                            tempIndex = j;
                        }
                    }
                }
                //tempIndex到i的数后移一位
                //将insertVal放在tempIndex的位置
                //如果tempIndex还是0说明新插入的最小
                //tempIndex=i-1说明新插入比前面的都大,就不用排列了
                if (tempIndex==0||tempIndex!=i-1){
                    for (int j = i; j > tempIndex; j--) {
                        arr[j]=arr[j-1];
                    }
                    arr[tempIndex] = insertVal;
                }
                tempIndex = 0;
                System.out.printf("第%d趟的结果是:%s
    ",i, Arrays.toString(arr));
            }
            return arr;
        }
        private static int[] insertSort2(int[] arr) {
            int length = arr.length;
            int insertVal = 0;//待插入的位置
            int insertIndex = 0;//待插入位置的前一个
            for (int i = 1; i < length; i++) {
                insertVal = arr[i];
                insertIndex = i - 1;
                //从前面的最后一个开始找,如果大于待插入的直接后移
                while (insertIndex>=0&&insertVal<arr[insertIndex]){
                    arr[insertIndex+1] = arr[insertIndex];
                    insertIndex--;
                }
                if (insertIndex!=i-1){
                    arr[insertIndex+1] = insertVal;
                }
                System.out.printf("第%d趟的结果是:%s
    ",i, Arrays.toString(arr));
            }
            return arr;
        }
        public static void main(String[] args){
            insertSort(new int[]{101,34,119,1});
            insertSort2(new int[]{101,34,119,1});
            //第1趟的结果是:[34, 101, 119, 1]
            //第2趟的结果是:[34, 101, 119, 1]
            //第3趟的结果是:[1, 34, 101, 119]
            //第1趟的结果是:[34, 101, 119, 1]
            //第2趟的结果是:[34, 101, 119, 1]
            //第3趟的结果是:[1, 34, 101, 119]
        }
    }
  • 相关阅读:
    CSUST--3.14排位周赛第四场 (全解)
    CSUST--3.7排位周赛第三场 (全解)
    android 代码功能测试junit test
    Sqlite数据库创建、删除、降级笔记
    三种进程和线程数据共享模块方法Queue》Pipe》manager
    多线程实例
    信号量
    红绿灯模型
    linshiwendang12--匈牙利
    spring--注入类型--构造方法(不常用)
  • 原文地址:https://www.cnblogs.com/fly-book/p/11661524.html
Copyright © 2020-2023  润新知