插入排序

本文详细介绍了一种简单的排序算法——插入排序。通过Java实现,演示了如何进行升序和降序排列,并分析了该算法的时间复杂度。对于已排序和逆序数组的不同表现进行了讨论。

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

问题描述
输入:n个数的一个序列(a1,a2,a3…an)
输出:输入序列的一个排序(a1’,a2’,a3’…an’),满足a1’

    INSERT-SORT(A)
for j=2 to A.length
    key=A[j];
    //Insert A[j] to sorted sequence A[1…j-1];
    i=j-1;
    while i>0 and A[i]>key
         A[i+1] = A[i]
         I=i-1
A[i+1] = key

算法复杂度
数组已排好序(最佳情况) O(n)
数组已经逆序(最坏情况) O(n2)
平均情况 O(n2)

import java.util.Random;

public class Main {

    private static int N=10;//测试的数组长度
    static Random rand = new Random();

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        test_ASC();
        test_DES();
    }
    //测试升序
    private static void test_ASC(){
        int[] A=new int[N];
        for(int i=0;i<N;i++){
            A[i]=rand.nextInt(1000);
        }
        Insert_Sort_ASC(A); 
    }

    //测试降序
    private static void test_DES(){
        int[] A=new int[N];
        for(int i=0;i<N;i++){
            A[i]=rand.nextInt(1000);
        }
        Insert_Sort_DES(A); 
    }

    //插入排序-升序
    private static void Insert_Sort_ASC(int[] A){
        System.out.println("排序前:");
        print(A);

        int key;
        int j;
        for(int i=1;i<A.length;i++){
            key=A[i];
            j=i-1;
            //找到合适的插入点 前面是已经排好序的数组
            while(j>=0 && A[j]>key){
                A[j+1]=A[j];
                j--;
            }
            A[j+1]=key;
        }

        System.out.println("排序后(升序):");
        print(A);
    }

    // 插入排序-降序
    private static void Insert_Sort_DES(int[] A) {
        System.out.println("排序前:");
        print(A);

        int key;
        int j;
        for(int i=1;i<A.length;i++){
            key=A[i];
            j=i-1;
            //找到合适的插入点 前面是已经排好序的数组
            while(j>=0 && A[j] < key){
                A[j+1]=A[j];
                j--;
            }
            A[j+1]=key;
        }

        System.out.println("排序后(降序):");
        print(A);
    }

    //打印数组
    private static void print(int[] A) {
        // TODO Auto-generated method stub
        for (int i = 0; i < A.length; i++) {
            System.out.print(A[i]+"\t");
        }
        System.out.println();
    }

}

运行截图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值