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

插入排序详解

时间:2023-12-10 12:14:43浏览次数:30  
标签:10 arr int 插入排序 元素 详解 有序 升序

算法思想

  把数列分成两部分,前面部分为有序区,后面部分为无序区,初始时有序区只有一个元素,一个数字组成的数列当然是有序的;

遍历无序区,把其中每个数不断地插入有序区,形成一个更大的有序区,遍历完成时整个数列也就有序了!

学习过程思想

  (1)两层 for 循环,第一层 for 循环是无序区,第二层 for 循环是有序区;

  (2)对于无序区的第 i 个元素,插入到有序区里面,使有序区元素个数逐渐递增;

  (3)有序区从第 i - 1 个元素开始,若为升序:有序区从 第 i - 1 个元素开始,逐渐往前遍历,arr[j] > arr[i],有序区元素后移:arr[j + 1] = arr[j]

  (4)有序区循环遍历完成之后,就会找到比 arr[i] 元素小的值的位置,插入第 i 个元素即可:arr[j + 1] = arr[i]

代码实践

#include <stdio.h>
#define N 10

int main() {
// 标准的输入输出不需要缓存,直接输出
setbuf(stdout, NULL);

// 初始化数组元素
int arr[N];
printf("请输入%d个数据:", N);
for (int i = 0; i < 10; ++i) {
scanf("%d", &arr[i]);
}

// 【插入排序】数组升序排列
int temp, j;
for (int i = 1; i < 10; i++) { // 无序区,需要插入第 i 个位置的无序元素
temp = arr[i];
for (j = i - 1; j >= 0 && arr[j] > temp; j--) { // 有序区,找到需要存放的第 i 个位置
arr[j + 1] = arr[j];
}
arr[j + 1] = temp;
}

printf("升序输出数组:");
for (int i = 0; i < 10; ++i) {
printf("%d ", arr[i]);
}
return 0;
}

运行结果

请输入10个数据:1 3 5 7 9 2 4 6 8 10
升序输出数组:1 2 3 4 5 6 7 8 9 10 

总结:每天进步一点点,持续学习,技能逐渐加深,自信心越来越强,坚持!

 

标签:10,arr,int,插入排序,元素,详解,有序,升序
From: https://www.cnblogs.com/michael-study/p/17892346.html

相关文章

  • Python - 【装饰器】详解
    一.概念Python装饰器本质上是一个函数,用于修改其他函数的功能。装饰器可以在不改变函数代码的情况下添加新的功能,使代码更具可读性、可维护性和可重用性。使用装饰器可以把一个函数传递给另一个函数,使其具有新的行为,而无需修改函数本身的代码。二.基本语法@decorator_namedeff......
  • 【JavaSE】数据结构-哈希表(HashSet/HashMap底层哈希表详解,源码分析)
    哈希表结构JDK8版本之前:数组+链表JDK8版本及之后:数组+链表+红黑树哈希表HashMapput()方法的添加流程创建HashSet集合时,构造方法中自动创建HashMap集合;HashMap空参构造方法会创建一个默认长度为16,默认加载因子为0.75的数组,数组名为table(tips:实际上,HashSet对象创建后,第......
  • 详解十大经典排序算法(六):快速排序(QuickSort)
    算法原理分区(Partition):选择一个基准元素,将数组分为两个子数组,小于基准的放在左边,大于基2准的放在右边。递归排序:对左右两个子数组分别进行快速排序。合并:不需要实际的合并操作,因为在分解和递归排序阶段已经完成了排序。算法描述快速排序是一种基于分治思想的高效排序算法,由英国......
  • Spring Boot学习随笔- @SpringBootApplication详解、加载绝对路径配置文件、工厂创建
    学习视频:【编程不良人】2021年SpringBoot最新最全教程3.5@SpringBootApplication详解这是一个组合注解,就是由多个注解组成。下列注解红框内称为元注解(jdk提供)@Target:指定注解作用范围@Retention:指定注解什么时候生效重要注解@SpringBootConfiguration:自动配置Spring......
  • 详解网络数据包发送的过程
    在ip_queue_xmit中,也即IP层的发送函数里面,有三部分逻辑。第一部分,选取路由,也即我要发送这个包应该从哪个网卡出去。这件事情主要由ip_route_output_ports函数完成。接下来的调用链为:ip_route_output_ports->ip_route_output_flow->__ip_route_output_key->ip_route_output_ke......
  • Python 输入输出与文件处理: io、pickle、json、csv、os.path 模块详解
    Python提供了强大的输入输出和文件处理工具,通过io、pickle和json等模块,开发者可以轻松处理文件、序列化和反序列化数据,并在不同格式之间进行转换。在本文中,我们将深入介绍这些模块的用法和实际示例。1.io模块:强大的输入输出工具io模块提供了对文件I/O进行灵活处理的能力......
  • Python 输入输出与文件处理: io、pickle、json、csv、os.path 模块详解
    Python提供了强大的输入输出和文件处理工具,通过io、pickle和json等模块,开发者可以轻松处理文件、序列化和反序列化数据,并在不同格式之间进行转换。在本文中,我们将深入介绍这些模块的用法和实际示例。1.io模块:强大的输入输出工具io模块提供了对文件I/O进行灵活处理的能力......
  • Thread常见方法:interrupt 方法详解
    打断sleep,wait,join的线程这几个方法都会让线程进入阻塞状态打断sleep的线程,会清空打断状态,以sleep为例privatestaticvoidtest1()throwsInterruptedException{Threadt1=newThread(()->{sleep(1);},"t1");t1.start();sleep(0.5);t1.interrupt();l......
  • Java ClassLoader、ContextClassLoader与SPI实现详解
    (目录)JavaClassLoaderClassLoader做什么的?​ 众所周知,Java或者其他运行在JVM(java虚拟机)上面的程序都需要最终便以为字节码,然后被JVM加载运行,那么这个加载到虚拟机的过程就是classloader类加载器所干的事情.直白一点,就是通过一个类的全限定类名称来获取描述此类......
  • React diff 算法详解
    代码参照React16.13.1什么是Diff在render阶段的beginWork函数中,会将上次更新产生的Fiber节点与本次更新的JSX对象(对应ClassComponent的this.render方法返回值,或者FunctionComponent执行的返回值)进行比较。根据比较的结果生成workInProgressFiber,即本次更新的Fiber节......