首页 > 其他分享 >(2.7)简单插入排序

(2.7)简单插入排序

时间:2023-03-08 20:33:04浏览次数:41  
标签:int 插入排序 key 简单 序列 2.7 复杂度 逆序


文章目录

  • ​​1.插入排序的思想​​
  • ​​2.插入排序的三步曲​​
  • ​​3.直接插入排序​​
  • ​​4.插入排序的本质​​

1.插入排序的思想

  • 基本思想: 将无序子序列中的一个或几个记录“插入”到有序子序列中,从而增加有序子序列的长度。

2.插入排序的三步曲

  • 不同的定位方法导致不同的插入算法
    (1)直接插入排序(基于顺序查找定位)
    (2)折半插入排序(基于折半查找定位)
    (3)希尔排序(基于逐趟缩小增量)

3.直接插入排序

  • 排序过程:整个排序过程为n-1趟插入,即先将序列中第1个记录看成是一个有序子序列,然后从第2个记录开始,逐个进行插入,直至整个序列有序
  • eg:插入排序理解的精华主要是在后面
  • 算法描述
typedef struct 
{
int key;
float info;
}JD;

//元素个数n,待排序的记录的首地址
void strausort(JD r[], int n)//对长度为n的序列排序
{
int i,j;
for (i=2;i<=n;i++)//将第1个位置当作有序序列,i表示待排序的数组下标
{
r[0]=r[i];//第0个位置作为岗哨
j=i-1;//有序序列的下标的最后一个元素位置
/*
j指针指向的关键字比岗哨关键字要大,就将j指针所指的关键字向后移动
*/
while (r[j].key > r[0].key)
{
r[j+1]=r[j];
j--;
}
r[j+1]=r[0];
}
}

//若不采用岗哨写法
void strausort(JD r[], int n)
{
int i,j;
for (i=2;i<=n;i++)
{
t=r[i];
j=i-1;//下标的最后一个元素位置
while (r[j].key > r[0].key && j>=1)
{
r[j+1]=r[j];
j--;
}
r[j+1]=r[0];
}
}
  • 算法时间复杂度
    (1)空间复杂度
    空间复杂度: S(n)=O(1)
    (2)时间复杂度
  • eg:顺序比较n-1次数,逆序需要比较(2.7)简单插入排序_插入排序次数。所以又是顺序,又是有序,比较次数肯定越少

(2.7)简单插入排序_子序列_02

4.插入排序的本质

  • 比较和交换(确定位置后,将其拷贝过去,将其看成是交换操作)
  • 序列中逆序的个数决定交换次数,所以平均逆序数量为 C(n,2)/2(随便取两个元素,然后取平均),所以T(n)=(2.7)简单插入排序_子序列_03
  • 简单插入排序复杂度由什么决定?
    逆序个数
  • 如何改进简单插入排序复杂度?
    (1)分组,比如C(n,2)/2>2C((n/2),2)/2 (就算乘以2,也比前面小)
    (2)3,2,1有3组逆序对(3,1)(3,2) (2,1)需要交换3次。但相隔较远的3,1交换一次后1,2,3就没有逆序对了。
    相隔较远的数据分到一组,每组使用简单插入排序后,这样整体上,小数据在前,大的在后
    (3)对所有数据排序后,基本有序的插入排序算法复杂度接近O(n)


标签:int,插入排序,key,简单,序列,2.7,复杂度,逆序
From: https://blog.51cto.com/u_12740336/6108860

相关文章

  • (2.7)希尔排序
    文章目录​​1.希尔排序(缩小增量法)​​​​2.排序过程​​​​3.最坏复杂度分析​​1.希尔排序(缩小增量法)基本思想:分割成若干个较小的子文件,对各个子文件分别进行直接......
  • c语言实现简单的飞机小游戏
    在今天浏览csdn的过程中,看到了一个用c语言做的简单的飞机小游戏,感觉非常有意思,代码如下:#include<stdio.h>#include<stdlib.h>#include<conio.h>intmain(){intx=15......
  • Qt for Android开发环境这样设置简单正确高效
    1.按照如下网址安装设置JDK、SDK、NDK版本并创建环境变量:JAVA_HOME、ANDROID_SDK_ROOT、ANDROID_NDK_ROOT。https://doc.qt.io/qt-6/android-getting-started.html2.如本......
  • Git简单总结
    0x01Git理解分布式版本控制器:在个人电脑,云端都有着所有的代码。版本控制,可自由回滚,向前向后。git记录的是快照,不是整个代码的备份;每个快照之间通过指针指向来记录。g......
  • 简单的主从复制
    简单的主从复制配置文件说明master:cat/etc/my.cnf[client]port=3306socket=/data/soft/mysql/mysql.sock[mysqld]user=mysqlport=3306socket=......
  • 冒泡排序(简单C++实现)
    实现代码如下://bubble_sort.cpp#include<stdio.h>voidprintArray(intarr[],intlen);//冒泡排序:最多进行n-1次排序intmain(){intarr[]={23,39,65,2......
  • pdf.js 企业微信浏览器无法打开及简单使用
     1.官网地址http://mozilla.github.io/pdf.js/getting_started/2.下载旧版本   3.复制到项目地址中使用<a>标签<ahref="../content/pdfjs-3.4.120-dist/web......
  • STL:map映照容器的简单用法(poj 2503 Babelfish)
    STL中map映照容器由一个键值和一个映照数据组成,具有一一对应的关系。结构为:键值--映照数据       例: aaa --111             bbb--222   ......
  • instanceof简单介绍
    官方说明是:判断左边的对象是不是右边对象类的实例   意思是说条件操作数类型int和int不兼容   instanceof左边不能是基本类型,需要是引用类型publicclass......
  • js 简单的深拷贝
    本题是通过@郝晨光 的文章受到的启发,学习来的,大家有兴趣可以看一下,而且我觉得这种写法非常通俗易懂,工作中也足够去使用了。functionDeepClone(target){letresult......