首页 > 其他分享 >排序3-插入排序

排序3-插入排序

时间:2024-04-22 20:57:58浏览次数:15  
标签:int 插入排序 内容 排序 部分 复杂度

排序3-插入排序


插入排序把排序对象分成已排序和未排序两个部分, 每次选取未排序部分的首元素, 将它插入已排序部分的合适部分


插入排序(正序)

//插入排序
void insertSort(int arr[], int length){
    int j;
    for(int i=1; i<length; i++){ // i是无序部分首元素的下标
        if(arr[i]<arr[i-1]){ //如果无序部分的首元素小于有序部分的最大值, 进入排序, 否则跳过本次循环
            int tmp = arr[i]; //tmp存储无序部分的首元素
            for(j=i-1; j>=0 && tmp<arr[j]; j--){ // j指向i之前的元素, 如果arr[j]<tmp或j<0, 循环结束
                arr[j+1] = arr[j]; //如果tmp < arr[j], 将arr[j]元素前移至arr[j+1]位置
            } 
            arr[j+1] = tmp; //将tmp赋值给arr[j+1]
        }
    }
}

最优情况: 当排序内容本身都是顺序(相对于要求的排序方式来说)的, 则只需要遍历一次内容,就可完成排序, 此时时间复杂度是 O(n).

最差情况: 如果排序内容本身都是逆序的, 时间复杂度为 O(n^2), 但相对于选择排序与冒泡效率, 插入排序的效率还是更高.


同样排序内容中, n=10000时, 插入排序与选择排序, 冒泡排序的耗时比较(单位: ms)



插入排序示意


以此类推

标签:int,插入排序,内容,排序,部分,复杂度
From: https://www.cnblogs.com/HIK4RU44/p/18151492

相关文章

  • 常见的排序算法——归并排序
    本文记述了自顶向下归并排序的基本思想和一份参考实现代码,并在说明了算法的性能后用随机数据进行了验证。◆思想使用自顶向下的分治思想进行排序。将待排序元素分为两个待排序子范围,用递归的方式对两个子范围分别排序。然后将排序结果归并起来,即得到整体排序的结果。归并两个已......
  • SQL Server 中将字符串按数字排序
    方法一:使用CAST或CONVERT我们可以使用CAST或CONVERT函数将字符串转换为数字,然后按照数字进行排序。示例如下:SELECT*FROMYourTableORDERBYCAST(YourColumnASINT)方法二:使用TRY_CAST或TRY_CONVERT如果我们不确定字符串中的所有值都可以成功转换为数字,我们可......
  • 排序2-选择排序
    排序2-选择排序每次找到最值的下标,最后交换元素,每次遍历的元素减少.减少了交换元素的次数.性能较冒泡排序更好一点,但时间复杂度仍是$O(n^2)$交换元素//交换voidSwap(int*a,int*b){inttmp=*a;*a=*b;*b=tmp;}打印数组voidPrintArray(......
  • 过滤与排序
    排序与过滤​ 查询所有才需要过滤,排序是按照某个规则排序排序简单使用导入类OrderingFilter在视图类重写filter_backends属性,在列表内填入导入的类重写ordering_fields属性,在列表内填入字段classBookView(ModelViewSet):queryset=Book.objects.all()serial......
  • 排序1-冒泡排序
    排序1-冒泡排序冒泡排序的次数是递减的,第一次确定了最大元素的位置,所以第二次只需要进行n-1次排列,第二次确定了第二大元素的位置,所以第三次只需要进行n-2次排列,以此类推for(inti=0;i<len;i++){//每次遍历的次数是递减的//所以j=len-1-i......
  • 归并排序
    归并排序左部分有序 ---> 右部分有序 --->整体有序查看代码//https://leetcode.cn/problems/sort-an-array/importjava.util.Arrays;classSolution{publicstaticfinalintMAX_N=100001;publicstaticint[]help=newint[MAX_N];publi......
  • 说说常见的排序算法有哪些?区别?
    一、是什么排序是程序开发中非常常见的操作,对一组任意的数据元素经过排序操作后,就可以把他们变成一组一定规则排序的有序序列排序算法属于算法中的一种,而且是覆盖范围极小的一种,彻底掌握排序算法对程序开发是有很大的帮助的对与排序算法的好坏衡量,主要是从时间复杂度、空间复......
  • 希尔排序
    #include<iostream>#include<cmath>usingnamespacestd;intmain(){intn;cin>>n;inta[n+5];for(inti=0;i<n;i++){cin>>a[i];}for(doublei=n;i>1;){i=round(i/2);for(i......
  • 希尔排序
    #include<bits/stdc++.h>usingnamespacestd;intmain(){ stringa="liuyixing"; for(doublei=9;i>1;){ i=round(i/2); for(intj=0;j+i<9;j++){ if(a[j]>a[j+(int)i]){ swap(a[j],a[j+(int)i]); } } } for(inti=0;i<......
  • JZ33 二叉排序树的后序遍历序列
    classSolution{public://判断该数组是不是某二叉搜索树的后序遍历的结果。//如果是则返回true,否则返回false//注意传入参数是一个int类型的vector容器boolVerifySquenceOfBST(vector<int>sequence){if(sequence.empty()) //二叉树......