首页 > 编程语言 >必学排序算法——插入排序

必学排序算法——插入排序

时间:2024-10-18 17:22:29浏览次数:3  
标签:arr int 插入排序 必学 insertionSort 算法 排序

目录

前言、

插入排序算法是必须掌握的一种基础算法,在一些比较出名的竞赛acm、蓝桥杯,可能会出现,而且作为简单题我们必须要拿下,所以我们要引起重视,下面让我们来深入了解插入排序算法。

在这里插入图片描述

一、什么是插入排序算法

插入排序(Insertion Sort)是一种简单直观的排序算法,其工作原理类似于我们平时整理扑克牌或手写数字时的排序方式。该算法的核心思想是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

二、插入排序的特点

时间复杂度
最坏情况:O(n^2),当输入数组是反序的。
最好情况:O(n),当输入数组已经是有序的。
平均情况:O(n^2)

空间复杂度
插入排序是原地排序算法,因此空间复杂度为O(1)。

稳定性
插入排序是稳定的排序算法,即不会改变相同元素的相对顺序。

适用性
插入排序适用于少量数据的排序,或者数据部分已经有序的情况。
通过插入排序算法,我们能够有效地对中小规模的数据集进行排序,同时保持代码的简洁和直观。对于大规模数据集,通常会选择更高效的排序算法,如快速排序或归并排序。

三、算法基本步骤

初始化:
1.从第一个元素开始,该元素可以认为已经被排序。
2.取出下一个元素,在已经排序的元素序列中从后向前扫描。
3.如果该元素(已排序)大于新元素,则将该元素移到下一位置。
4.重复步骤3,直到找到已排序的元素小于或者等于新元素的位置。
将新元素插入到该位置后。
5.重复步骤2~5。
终止:
当所有元素都插入到已排序序列中,算法结束。

四、算法图解

在这里插入图片描述

五、c代码模板

#include <stdio.h>  
  
// 插入排序函数  
void insertionSort(int arr[], int n) {  
    for (int i = 1; i < n; i++) {  
        int key = arr[i];  
        int j = i - 1;  
  
        // 将arr[i]插入到已排序的arr[0..i-1]中  
        while (j >= 0 && arr[j] > key) {  
            arr[j + 1] = arr[j];  
            j = j - 1;  
        }  
        arr[j + 1] = key;  
    }  
}  
  
// 打印数组函数  
void printArray(int arr[], int size) {  
    for (int i = 0; i < size; i++) {  
        printf("%d ", arr[i]);  
    }  
    printf("\n");  
}  
  
// 主函数  
int main() {  
    int arr[] = {12, 11, 13, 5, 6};  
    int n = sizeof(arr) / sizeof(arr[0]);  
  
    printf("未排序数组: ");  
    printArray(arr, n);  
  
    insertionSort(arr, n);  
  
    printf("已排序数组: ");  
    printArray(arr, n);  
  
    return 0;  
}

六、经典例题

1.去掉最低工资和最高工资后的工资平均值

(帅哥们这个蓝色字体可以点进去看原题)

代码题解

class Solution {
    void insertionSort(vector<int>&s){
        for(int i=1;i<s.size();i++){
            int x=s[i];
            int j;
            for(j=i-1;j>=0;j--){
                if(x<s[j])s[j+1]=s[j];
                else break;
            }
            s[j+1]=x;
        }
    }
public:
    double average(vector<int>& salary) {
        double sum=0.0000;
        insertionSort(salary);
        for(int i=1;i<salary.size()-1;i++){//去掉排序后第一个元素和最后一个元素
            sum+=salary[i];
        }
        return sum/(salary.size()-2);
    }
};

2.删除某些元素后的数组均值

(帅哥们这个蓝色字体可以点进去看原题)

class Solution {
    void insertionSort(vector<int>&a){
        for(int i=1;i<a.size();i++){
            int x=a[i];
            int j;
            for( j=i-1;j>=0;j--){
                if(a[j]>x)a[j+1]=a[j];
                else break;
            }
            a[j+1]=x;
        }
    }
public:
    double trimMean(vector<int>& arr) {
        insertionSort(arr);
        double sum=0;
        int cnt=0;
        int n=arr.size();
        for(int i=n/20;i<n-n/20;i++){//看提示,n是二十的倍数,也就是说n除以20(n*0.05),就是去除前5%和后5%
            sum+=arr[i];
            cnt++;
        } 
        return sum/cnt;
    }
};

3.学生分数的最小差值

(帅哥们这个蓝色字体可以点进去看原题)

class Solution {
    void insertionSort(vector<int>&a){
        for(int i=1;i<a.size();i++){
            int x=a[i];
            int j;
            for(j=i-1;j>=0;j--){
                if(a[j]>x)a[j+1]=a[j];
                else break;
            }
            a[j+1]=x;
        }
    }
public:
    int minimumDifference(vector<int>& nums, int k) {
        insertionSort(nums);
        int ret=1000001;//定义一个之来记录最小值,赋值为很大的数
        for(int i=0;i+k-1<nums.size();i++){//i+k-1这个范围一定小于数组的长度,
            int l=i;//最左边那个值就是最小的值
            int r=l+k-1;//最右边那个值就是最大的值
            ret=min(ret,nums[r]-nums[l]);//判断当前的差值是否比之前的小,如果小,最小值就变成这个差值,否则还是原来的,min这个函数是自带的。
        }
        return ret;
    }
};

七、结语

学习算法是一个很艰难,漫长的过程,我们要克服一切困难,学习算法本就是由易到难,我相信通过我们坚持不懈的努力一定能理解并熟练掌握其中细节,加油。

在这里插入图片描述

关注我让我们一起学习编程,希望大家能点赞关注支持一下,让我有持续更新的动力,谢谢

在这里插入图片描述

标签:arr,int,插入排序,必学,insertionSort,算法,排序
From: https://blog.csdn.net/ycs66/article/details/143029909

相关文章

  • 必学的简单排序算法——选择排序(c++)
    标题前言一、什么是选择排序二、算法图解三、经典例题1、颜色分类题解思路代码题解2、至少是其他数字两倍的最大数解题思路代码题解3、寻找两个正序数组的中位数解题思路代码题解前言排序算法虽然简单,但是我也要掌握熟练应用,因为学习算法这个复杂的过程,我们应该......
  • 83. 删除排序链表中的重复元素 线性法&快慢双指针
    83.删除排序链表中的重复元素给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。示例1:输入:head=[1,1,2]输出:[1,2]示例2:输入:head=[1,1,2,3,3]输出:[1,2,3]提示:链表中节点数目在范围 [0,300] 内-100<=......
  • 算法与数据结构——桶排序
    桶排序前面的快速排序、归并排序、堆排序等都是属于“基于比较的排序算法”,它们通过比较元素间的大小来实现排序。此类排序算法的时间复杂度无法超越O(nlogn)。下面介绍几种“非比较排序算法”,它们的时间复杂度可以达到线性阶。桶排序(bucketsort)是分治策略的一个典型应用。它通......
  • 八种经典排序算法
    以下是八种经典排序算法的介绍,包括它们的基本思想、时间复杂度、稳定性以及代码示例:1.插入排序基本思想:每步将一个待排序的元素按其关键码值的大小插入到前面已经排序的部分中,直到全部插入完为止。时间复杂度:最坏和平均情况为O(n²),最佳情况为O(n)(当数据基本有序时)。稳定性:......
  • 排序算法 - 快速排序
    排序算法-快速排序  概要  快速排序(Quicksort)是对冒泡排序算法的一种改进。快速排序是一种基于分而治之的排序算法。  它的基本思想是:选择一个基准数,通过一趟排序将要排序的数据分割成独立的两部分;其中一部分的所有数据都比另外一部分的所有数据都要小。然后,再按......
  • 归并排序(Java)
    思想:基本思想是使用递归将数组不断分成两半,直到分成的小组都只剩下一个元素为止,随后分别开始排序,将排序好的数组合并在一起。归并排序使用了分治(DivideandConquer)的思想。包括以下三个步骤:划分(Divide):将原问题分解成几个规模较小的相同问题。解决(Conquer):递归求解这些子问......
  • Topk问题与堆排序(Java数据结构)
    前言:    接触完堆之后,也逐渐对堆了如指掌,最后再来讨论一下两个问题。    有如下场景:    1、全国有几千所大学,我如何能够快速找出排名前10的大学?    2、我如何对这10所大学排好序?    为了用堆解决问题,接下来我们就来一起学习Top......
  • Java的Stream流编程的排序sorted方法里参数o1,o2分别代表什么?
    先说结论:在sorted方法中,o1是最后面的元素,o2是倒数第二个元素,以此类推,流是处理元素是从后面开始取值。  packagecom.br.itwzhangzx02.learn;     importorg.junit.Test;   importjava.util.ArrayList; importjava.util.List;......
  • 时间复杂度为 O(n^2) 的排序算法
    作者:京东保险王奕龙对于小规模数据,我们可以选用时间复杂度为O(n2)的排序算法。因为时间复杂度并不代表实际代码的执行时间,它省去了低阶、系数和常数,仅代表的增长趋势,所以在小规模数据情况下,O(n2)的排序算法可能会比O(nlogn)的排序算法执行效率高。不过随着数据规模增大,......
  • Collections.sort多个字段排序
    //生效日期、操作时间倒序、机型组升序privatevoidsort(List<IntpathcostAreaGroupstVO>data){Comparator<Object>com=Collator.getInstance(java.util.Locale.CHINA);Collections.sort(data,newComparator<IntpathcostAreaGroupstVO>(){@Override......