023.插入排序思路分析和代码实现


博主的 Github 地址


1. 插入排序整体分析

1.1. 基本介绍

  • 插入式排序(insertion sorting)属于内部排序法
  • 是将待排序数组的元素以插入的方式去寻找适当的位置, 以达到排序的目的

1.2. 排序思想

插入排序的基本思想是:

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

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

  • 排序过程中每次从无序表中取出第一个元素,
    把它的排序码依次与有序表元素的排序码进行比较
    将它插入到有序表中的适当位置, 使之成为新的有序表


1.3. 排序图解

插入排序图解


2. 插入排序代码实现

2.1. 插入排序整体代码

  • 算法细节看注释即可
package com.leo9.dc13.insertion_sort;

import java.util.Arrays;

public class InsertionSort {
    public static void main(String[] args) {
        int[] arr = {4, 5, 10, 20, 7, 3};
        System.out.println("origin array -> " + Arrays.toString(arr));
        sortArray(arr);
        System.out.println("sorted array -> " + Arrays.toString(arr));
    }

    //编写插入排序算法
    public static void sortArray(int[] arr){
        //获取数组长度
        int arr_length = arr.length;
        //要获取除了第一个数的每个数与前面的值进行比较, 因此循环次数为数组长度减一
        for (int i = 1; i < arr_length; i++) {
            //要插入值从数组第二个元素开始, 第一个元素默认有序
            int insertVal = arr[i];
            //从当前要插入元素的上一位到数组首位开始逐一比较, 因此插入的比较索引为当前插入值索引减一
            int insertIndex = i - 1;
            //防止索引出界超出首位元素之前, 因此要大于0
            //若当前要插入元素小于比较位元素, 比较位元素向后一位复制, 相当于后移
            //即若有数组为[3,4,5,1]进行插入排序, 第一次移位变成[3,4,5,5], 第二次移位变成[3,4,4,5], 第三次移位是[3,3,4,5], 插入位置是最后一次比较位的前一位, 当前最后一位是-1, 前一位则是0
            //因为是从数组后端开始进行比较, 且对插入元素用变量进行保存, 因此元素后移并不会导致元素缺失.
            while(insertIndex >= 0 && insertVal < arr[insertIndex]){
                arr[insertIndex + 1] = arr[insertIndex];
                //索引向前移动
                insertIndex --;
            }
            //索引值发生改变则进行插入, 插入位置是最后一次比较位的前一位
            if(insertIndex != i - 1){
                arr[insertIndex + 1] = insertVal;
            }
        }
    }
}

2.2. 测试结果

2.2.1. 数组1

Array1

2.2.2. 测试 8 万条随机数数组

平均时间是 5s

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是直接插入排序的完整C语言代码: ```c #include <stdio.h> void insertion_sort(int arr[], int n) { int i, j, key; for (i = 1; i < n; i++) { key = arr[i]; j = i - 1; while (j >= 0 && arr[j] > key) { arr[j + 1] = arr[j]; j = j - 1; } arr[j + 1] = key; } } int main() { int arr[] = {64, 25, 12, 22, 11}; int n = sizeof(arr) / sizeof(arr[0]); insertion_sort(arr, n); printf("Sorted array: "); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } printf("\n"); return 0; } ``` 该程序使用了一个名为`insertion_sort`的函数来执行直接插入排序。在`main`函数中,我们定义了一个整数数组`arr`,包含了一些未排序的数字。我们使用`sizeof`操作符计算数组的大小,然后将其作为参数传递给`insertion_sort`函数。 `insertion_sort`函数首先定义了三个整数变量`i`,`j`和`key`。`i`用于遍历数组中的元素,`j`用于向前扫描已排序的子数组,`key`用于存储当前要插入的元素。在排序过程中,我们从数组的第二个元素开始循环,将当前元素存储在`key`变量中,并将`j`初始化为当前元素的前一个位置。 然后,我们开始向前扫描已排序的子数组,如果当前元素比`key`大,则将已排序的子数组中的元素向右移动一个位置,为当前元素腾出空间。当已排序的子数组中的元素小于或等于`key`时,我们将`key`插入到已排序的子数组中的正确位置。 最后,我们在`main`函数中输出已排序的数组。 实验步骤: 1. 打开C语言编译器,创建一个新的源代码文件。 2. 复制上述代码并将其粘贴到新文件中。 3. 编译并运行程序,查看排序后的结果。 设计思路: 直接插入排序算法的基本思想是将未排序的元素插入到已排序的子数组中,从而得到一个逐步增长的已排序数组。该算法的时间复杂度为O(n²),适用于小规模数据排序。在该程序中,我们使用一个名为`insertion_sort`的函数来执行直接插入排序。该函数使用两个循环来遍历数组中的元素,并将当前元素插入到已排序的子数组中的正确位置。最后,我们在`main`函数中输出已排序的数组。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值