IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 插入排序算法 -> 正文阅读

[数据结构与算法]插入排序算法

插入排序(Insertion Sort)一般也被称为直接插入排序。直接插入排序算法比较简单,容易实现,是一种稳定的排序算法当待排序元素数量n很小且局部有序时,较为适用

它的基本思想是将一个关键字插入到已经排好序的有序列中,从而得到一个新的、元素数增1的有序列。假设在过程中,元素序列为 R[0…n-1],首先将第一个元素 R[0] 看作一个有序子序列,然后依次将元素 R[i] (1<=i<=n-1)插入有序子序列 R[0…n-1] 中,使元素的有序子序列从 R[0…i-1] 变为 R[0…i]

实现要点

在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序列进行待插入位置查找,并进行移动

测试用例: 使用插入排序算法将数组 { 4,2,8,0,5,7,1,3,6,9 } 进行升序排序

在这里插入图片描述

代码实现


package insertion_sorting;

public class InsertSorting {

    public static void main(String[] args) {
        InsertSorting insertSorting = new InsertSorting();
        int[] arr = new int[]{4,2,8,0,5,7,1,3,6,9};
        int[] afterSort = insertSorting.straightSort(arr, arr.length);
        long end = System.currentTimeMillis();


        System.out.print("排序之后的结果:{");
        StringBuffer buffer = new StringBuffer();
        for (int i = 0; i < afterSort.length; i++) {

            if (i != (afterSort.length-1)){
                buffer.append(afterSort[i]+",");
            } else buffer.append(afterSort[i]);
            
        }
        System.out.println(buffer.toString() + "}");
    }

    /**
     * 直接插入排序
     * 最好情况下的时间复杂度为O(n)
     * 最坏的情况下的时间复杂度和平均时间复杂度为O(n^2)
     * 在直接插入排序的过程中,需要一个元素大小的辅助空间用于存放待插入的元素,因此空间复杂度为O(1)
     * @param nums 数组
     * @param size 数组大小
     * @return 返回排列好的数组
     */
    public int[] straightSort(int[] nums, int size){
        int position, j;        // position为待插入的数据位置
        int temp;       // 用于存放待比较的值
        for (position = 1; position < size; position++) {   // 循环遍历数组
            temp = nums[position];      // 定义待比较的值
            for (j = position - 1; 0 <= j && temp < nums[j]; j--) {    // 循环遍历有序列,与temp比较值的大小,一直到数组下标0为止
                nums[j+1] = nums[j];    // 将大的元素向后移动,因为第j+1个元素本身就是temp,覆盖的话没有关系
                nums[j] = temp;         // 将小的替换大的元素的位置
            }
        }
        return nums;
    }
}


排序前:
4 2 8 0 5 7 1 3 6 9

排序后:
0 1 2 3 4 5 6 7 8 9

时间复杂度
最好的情况是,初始序列为有序,关键字总比较次数最小值为1 + 2 + 3 + . . . + (n-1),也就是无须后移元素

最坏的情况是,初始序列为有序,关键字总比较次数为最大值1 + 2 + 3 + . . . + ( n ? 1 ) = n ( n ? 1 ) / 2 = 1 2 n 2 \frac{1}{2}n^2 21?n2 - 1 2 n \frac{1}{2}n 21?n = ∑ i = 2 n i \sum_{i=2}^n i i=2n?i
也就是每个关键字都需要与有序序列的每一个元素比较,时间复杂度为 O ( n 2 ) O(n^2) O(n2)
上面那个例子就是最坏的情况下

空间复杂度
在直接插入排序的过程中,只需要一个元素大小的辅助空间用于存放待插入的元素,因此空间复杂度为 O ( 1 ) O(1) O(1)

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-07-17 16:48:39  更:2022-07-17 16:51:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 23:35:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码