• java排序算法(六):直接插入排序


    java排序算法(六):直接插入排序

      直接插入排序的基本操作就是将待的数据元素按其关键字的大小插入到前面的有序序列中

       直接插入排序时间效率并不高,如果在最坏的情况下,所有元素的比较次数的总和为(0+1..n-1)= o(n^2).其他情况下也要考虑移动元素的次数。故时间复杂度是o(n^2)

       直接插入空间效率很好,只需要一个缓存数据单元,也就是说空间复杂度是o(1)

       直接插入排序是稳定的

       直接插入排序在数据以有一定顺序的情况下,效率较好。但如果数据无规则,则需要移动大量的数据。其效率就和冒泡排序和选择排序一样差了。

      算法描述

      对一个有n个元素的数据序列,排序需要n-1趟插入操作

      第一趟插入 将第二个元素插入到前面的有序子序列-此时前面只有一个元素。当然是有序的

      第二趟插入 将第三个元素插入前面的有序子序列。前面两个元素都是有序的

      第n-1趟插入将第n个元素插入前面的有序序列,前面n-1个元素是有序序列

      代码实现

      

    package com.spring.test;
    
    import java.awt.print.Printable;
    
    /**
     * 直接插入排序算法
     */
    public class InsertSortTest {
        public static void main(String[] args) {
            int[] data = new int[] { 5, 3, 6, 2, 1, 9, 4, 8, 7 };
            print(data);
            insertSort(data);
            System.out.println("排序后的数组");
            print(data);
        }
    
        public static void insertSort(int[] data){
            for(int i=1;i<data.length;i++){
                //缓存i处的元素值
                int tmp = data[i];
                if(data[i] < data[i-1]){
                    int j = i-1;
                    //整体后移一格
                    while(j>=0 && data[j] > tmp){
                        data[j+1] = data[j];
                        j--;
                    }
                    //最后将tmp插入合适的位置
                    data[j+1] = tmp;
                    print(data);
                }
            }
        }
    
        /**
         * 打印输出
         */
        public static void print(int[] data){
            for(int i=0;i<data.length;i++){
                System.out.print(data[i]+"	");
            }
            System.out.println();
        }
    
        /**
         * 交换数据
         */
        public static void swap(int[] data,int i,int j){
            if(i==j){
                return;
            }
            data[i] = data[i]+data[j];
            data[j] = data[i]-data[j];
            data[i] = data[i]-data[j];
        }
    }

    运行结果

  • 相关阅读:
    【积累总结】JS基础日常总结
    【积累总结】CSS日常总结
    【学习】JavaScript单线程与异步
    【学习指南】淘宝首页性能优化实践
    【学习】JS中的跨域
    007_stdc_C语言基础
    006_stdc_C语言基础
    005_stdc_C语言基础
    004_stdc_C语言基础
    003_stdc_linux基本常用命令_C语言基础
  • 原文地址:https://www.cnblogs.com/hanxue112253/p/8473875.html
Copyright © 2020-2023  润新知