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

插入排序

时间:2023-03-29 13:13:38浏览次数:30  
标签:38 idx 插入排序 无序 arrs 有序 序列

欢迎关注fish的公众号:fish码农成长之旅

插入排序的算法实现没有冒泡排序跟选择排序来的那么的直观易懂,但是其算法思想是最容易理解的。通过构建有序序列,对于未排序的序列在已排序的序列中找到相应位置并插入。

算法步骤

把数组分为有序序列(初始化为1,第一个就是有序的)跟无序序列(剩下的n - 1个数)。选择最前端的无序序列的数,从右到左遍历有序序列,找到相应位置插入,有序序列加一,无序序列减一。

实例演示

总共7个数的排序,按照从小到大排序,原始数据为:3 38 5 1 9 4 10

由图看出:
第一次遍历,3为有序,38为无序序列最前端的数,相比较之后有序序列变为3 38;
第二次遍历,5为无序序列最前端的数,首先跟38比较,应该在38之前,再跟3比较,应该在3之后,有序序列变为3 5 38;
第三次遍历,1为无序序列最前端的数,首先跟38比较,应该在38之前,再跟5比较,应该在5之前,再跟3比较,应该在3之前,有序序列变为1 3 5 38。

剩下的同理。

代码实现

template <class T>
void insertion_sort(std::vector<T> &arrs) {
  int n = arrs.size();  // 数组的大小
  if (n <= 1) {         // 一个数的情况不需要排序
    return;
  }

  for (int idx_i = 1; idx_i < n; ++idx_i) {  // 无序数组 从第一个到最后一个
    T key = arrs[idx_i];                     // 无序数组的最前端元素
    int idx_j = idx_i - 1;
    for (
        idx_j = idx_i - 1; idx_j >= 0 && arrs[idx_j] > key;
        idx_j--) {  // 遍历有序数组,把不合适的全部往后移动一位,直到找到合适的位置
      arrs[idx_j + 1] = arrs[idx_j];
    }
    // 在合适的位置上放上 无序数组最前端的元素
    arrs[idx_j + 1] = key;
  }
}

标签:38,idx,插入排序,无序,arrs,有序,序列
From: https://www.cnblogs.com/xiguan/p/17268537.html

相关文章

  • 插入排序
      代码实现:publicclass插入排序{publicstaticvoidmain(String[]args){int[]array={3,44,38,44,72,54,32,43,242,46,47,56};//定义一......
  • 漫画:什么是插入排序算法?
    面试官:聊聊插入排序插入排序是一种比较简单直观的排序算法,适用处理数据量比较少或者部分有序的数据,今天我们来聊聊插入排序一、排序思想只见慧能拿出了一副牌,洗......
  • 排序算法 之 (直接插入排序)
    10.6、堆排序对于n个关键字序列L[1...n],满足下面某一条性质,则称为堆(Heap)若满足:\(L(2i)\leL(i)\)且\(L(2i+1)\leL(i)\),\(1\lei\len\),大根堆(大顶堆)若满足:\(L(......
  • 插入排序——C语言描述
    插入排序——C语言描述目录插入排序——C语言描述0测试用例框架1定义2代码4测试用例0测试用例框架https://blog.csdn.net/m0_59469991/article/details/127137119?......
  • 【排序算法】插入排序
    1 前言今天把排序的几个算法过一下,这节我们看一下插入排序,简单的来说就是从第2个元素往前寻找位置进行插入,我们看示例。2 代码示例/***插入排序*从第2个元素......
  • (2.7)简单插入排序
    文章目录​​1.插入排序的思想​​​​2.插入排序的三步曲​​​​3.直接插入排序​​​​4.插入排序的本质​​1.插入排序的思想基本思想:将无序子序列中的一个或几个记录......
  • 数据结构与算法【基础版】:3.5排序算法之希尔排序(属于插入排序)
    3.5排序算法之希尔排序(属于插入排序)思路:第一轮1.先用数组长度/2等于一个值,该值就是区间的步长(做为比较)9/2=42.让每个部分都做一个插入排序第一部分的比较:后续部分一样......
  • 插入排序
    //插入排序classInsertSort{publicvoidsort(int[]a){inti,j,temp;for(i=1;i<a.length;i++){if(a[i]<a[i-1]){......
  • 插入排序
    definsertion_sort(list):N=len(list)foriinrange(1,len(list)):forjinrange(i,0,-1):iflist[j]<list[j-1]:......
  • 插入排序
    插入排序的时间复杂度是N^2。插入排序有N-1趟排序组成,对于i=1到N-1趟,插入排序保证从位置0到位置i的元素处于排好的状态。从位置j开始与前一个比较,符合条件的就交换,一直到不......