详解排序算法之插入排序(一)

本文详细介绍了两种常见的排序算法——直接插入排序和希尔排序。直接插入排序是简单直观的排序方法,时间复杂度为O(N^2),适合小规模或接近有序的数据。希尔排序则通过分组进行插入排序,提高效率,时间复杂度为O(N^1.3),适用于大规模且无序的数据。两者均为空间复杂度为O(1)的排序算法。

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

1. 直接插入排序

插入排序是各种排序算法中较为简单的一种排序,其主要思想是:

将数组看作有序部分和无序部分,默认第一个元素是有序的。

从第二个元素开始往前插入,如果有序部分的元素大于要插入的元素,就继续向前遍历,直到碰见一个元素小于要插入的元素,这时,将要插入的元素插入该元素后面。

注意,在遍历的时候,大于要插入元素的元素一直在向后移动。

注:在这里所讲的排序是以升序为例的。

下图详细描述了插入排序的过程:

代码如下:

class InsertSort{
    public void insertSort(int[] arr){
        int size = arr.length;
        //默认第一个数字有序,从第二个开始排序
        for (int i = 1; i < size; i++){
            //要排序的元素
            int key = arr[i];
            //有序部分的最后一个元素
            int end = i - 1;
           while (end >= 0 && arr[end] > key){
               arr[end+1] = arr[end];
               end--;
           }
           arr[end+1] = key;
        }
    }
}

public class Test {
    public static void main(String[] args)  {
        int[] arr = {90,21,25,16,8,1};
        InsertSort inSort = new InsertSort();
        inSort.insertSort(arr);
        for (int tmp : arr)
            System.out.print(tmp + "、");
    }
}

可以根据代码看出来,直接插入排序的时间复杂度是O(N^2),并没有使用额外的空间,所以它的空间复杂度是O(1),它是一种稳定的排序算法。所谓稳定就是如果数组中出现两个相同的元素,在排序完后并不会改变两个元素的位置。

适用于数据量小,并且接近有序的数组

 

2. 希尔排序

希尔排序的思想和插入排序类似:

将数组分组,化大数据量为小数据量,然后用插入排序来时每组的元素有序。

组数不断减小,直到为1,这个数组就有序了。

下图详细描述了希尔排序的过程:

代码如下:

class ShellSort{
    public void shellSort(int[] arr){
        int gap = arr.length;
        //注意,这里是大于1而不是0,因为如果大于0的话,gap为1时进去还是1,会变成死循环
        while (gap > 1){
            gap = gap/3+1;
            for (int i = gap; i < arr.length; i++){
                int key = arr[i];
                int end = i - gap;
                while(end >= 0 && arr[end] > key){
                    arr[end+gap] = arr[end];
                    end = end-gap;
                }
                arr[end+gap] = key;
            }
        }
    }
}

public class Test {
    public static void main(String[] args)  {
        int[] arr = {90,21,25,16,8,1};
       ShellSort shSort = new ShellSort();
       shSort.shellSort(arr);
        for (int tmp : arr)
            System.out.print(tmp + "、");
    }
}

希尔排序的时间复杂度是O(N^1.3),并没有使用额外的空间,所以它的空间复杂度是O(1),它是一种不稳定的排序算法。

适用于数据量大,并且数据较为凌乱。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值