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

本文详细介绍了直接插入排序算法的工作原理及其实现过程。该算法通过将每个元素按关键字大小插入到已排序序列中的适当位置来完成排序。适用于部分有序的数据集,但在数据完全无序时效率较低。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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]+"\t");
        }
        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];
    }
}

 

运行结果

 

转载于:https://www.cnblogs.com/hanxue112253/p/8473875.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值