C语言程序设计十大排序—插入排序

devtools/2025/1/22 21:44:18/

文章目录

  • 1.概念✅
  • 2.插入排序🎈
  • 3.代码实现✅
    • 3.1 直接写✨
    • 3.2 函数✨
  • 4.总结✅
  • 5.十大排序

1.概念✅

  排序是数据处理的基本操作之一,每次算法竞赛都很多题目用到排序。算法>排序算法是计算机科学中基础且常用的算法,排序后的数据更易于处理和查找。在计算机发展的历程中,在算法>排序算法的研究一直深受人们重视,出现了很多算法,在思路、效率、应用等方面各有特色。通过学习算法>排序算法,读者可以理解不同算法的优势和局限性,并根据具体情况选择最合适的算法,以提高程序的性能和效率。学习算法>排序算法还有助于培养逻辑思维和问题解决能力,在解决其他类型的问题时也能够应用到类似的思维方法。

2.插入排序🎈

  插入排序(Insertion Sort)是一种“动态”算法,在一个有序数列上这个增加数据,当新增一个数x时,把它插到有序数列中的合适位置,使数列扔保持有序。初始的数列是空的,这个插入所有的n个数据后,这n个数据就排好了序。
  如何把x插到合适的位置?简单的做法是从有序数列的最后一个开始,逐个与x比较,若这个数比x大,就继续往前找,直到找到比x小的数,把x插到它的后面。
  具体操作{12, 11, 13, 5, 6}为例,如下图所示:
 (1)从第一个数a[0]开始,它构成了长度为1的有序数列a[0]。

在这里插入图片描述

 (2)新增a[1],把它插到有序数列{a[0]}中。

  若a[1]>a[0],完成,
  若a[1]<a[0],把a[1]插到a[0]的前面。方法是先把a[0]移到数列的第2个位置,然后把a[1]放到数列的第1个位置,得到新的有序数列{a[0],a[1]}。
  (3)新增a[2],把它插到有序数列{a[0], a[1]}中。
在这里插入图片描述
  概括插入排序的原理:将待排序的元素划分为“已排序”和“未排序”两个部分,每次从“未排序的”元素中选取一个插到“已排序”元素中的正确位置。插入排序的一个列子是打扑克时抓牌,每抓一张牌,就插入到手中排好序的牌中。

3.代码实现✅

3.1 直接写✨

#include "stdio.h"
int main() {int arr[] = {12, 11, 13, 5, 6}; // 原始数组int n = sizeof(arr) / sizeof(arr[0]); // 数组大小int i;// 插入排序实现for ( i = 1; i < n; i++) {int key = arr[i];  // 当前待插入的元素int j = i - 1;// 将大于key的元素移到右侧while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j--;}// 插入当前元素到正确的位置arr[j + 1] = key;}// 打印排序后的数组printf("排序后的数组: \n");for (i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");
}

3.2 函数✨

#include <stdio.h>void insertionSort(int arr[], int n) {int i, key, j;// 从第二个元素开始,遍历整个数组for (i = 1; i < n; i++) {key = arr[i];  // 当前待插入的元素j = i - 1;// 将大于key的元素移到右侧while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j--;}// 插入当前元素到正确的位置arr[j + 1] = key;}
}void printArray(int arr[], int n) {int i; for ( i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");
}int main() {int arr[] = {12, 11, 13, 5, 6}; // 原始数组int n = sizeof(arr) / sizeof(arr[0]); // 数组大小insertionSort(arr, n); // 调用插入排序函数printf("排序后的数组: \n");printArray(arr, n); // 打印排序后的数组return 0;
}

4.总结✅

  插入排序的计算复杂度取决于第5行的for循环和第8行的while循环,这是两重循环,各循环O(n)次,总计算复杂度O(n^2)。
    插入排序是不是和冒泡排序一样“聪明”?也就是说,如果待排序的数列已经有序了,再运行插入算法>排序算法,插入排序是否知道已经排好序?此时第8行的while的判断条件a[i]>key始终不成立,while内的不会执行,而实际上就是a[i]=key,没有任何变化。也就是说,再次插入都是插到末尾,不用插到中间。那么for、while这两重循环实际上变成了只有for一个循环,一共计算O(n)次即结束。所以插入排序和“冒泡”排序一样“聪明”。

Perspective-takling

5.十大排序

1.冒泡排序
2.选择排序


http://www.ppmy.cn/devtools/152695.html

相关文章

CentOS 安装Redis

1. 安装 Redis 安装 EPEL 仓库&#xff08;对于 CentOS/RHEL 系统&#xff09;&#xff1a; 首先安装 EPEL 仓库&#xff0c;因为 Redis 存在于 EPEL 仓库中&#xff1a; yum install epel-release安装 Redis 数据库&#xff1a; yum install redis2. 修改 Redis 配置文件 …

【网络协议】【http】【https】RSA+AES-TLS1.2

【网络协议】【http】【https】RSAAES-TLS1.2 https并不是一个协议 而是在传输层之间添加了SSL/TLS协议 TLS 协议用于应用层协议&#xff08;如 HTTP&#xff09;和传输层&#xff08;如 TCP&#xff09;之间&#xff0c;增加了一层安全性来解决 HTTP 存在的问题&#xff0c;H…

如何使用Python爬虫获取微店商品详情:代码示例与实践指南

在电商领域&#xff0c;获取商品详情数据对于商家和开发者来说至关重要。微店作为国内知名的电商平台&#xff0c;提供了丰富的商品数据接口&#xff0c;方便开发者通过API调用获取商品详情。本文将详细介绍如何使用Python爬虫获取微店商品详情&#xff0c;并提供具体的代码示例…

MATLAB语言的文件操作

MATLAB语言的文件操作 1. 引言 MATLAB是一种高性能的语言&#xff0c;广泛应用于数学计算、数据分析和可视化等领域。在实际的应用中&#xff0c;经常需要对文件进行操作&#xff0c;包括读取文件、写入文件以及对文件进行修改等。本文将详细探讨MATLAB的文件操作&#xff0c…

从零到一:Spring Boot 与 RocketMQ 的完美集成指南

1.Rocket的概念与原理 RocketMQ 是一款由阿里巴巴开源的分布式消息中间件&#xff0c;最初用于支持阿里巴巴的海量业务。它基于发布-订阅模型&#xff0c;具备高吞吐、低延迟、高可用和强一致性的特点&#xff0c;适用于消息队列、大规模数据流处理等场景。以下是对 RocketMQ …

Linux测试处理fps为30、1920*1080、一分钟的视频性能

前置条件 模拟fps为30、1920*1080、一分钟的视频 项目CMakeLists.txt cmake_minimum_required(VERSION 3.30) project(testOpenGl)set(CMAKE_CXX_STANDARD 11)add_executable(testOpenGl main.cpptestOpenCl.cpptestOpenCl.hTestCpp.cppTestCpp.hTestCppThread.cppTestCppTh…

【Linux入门】2w字详解yum、vim、gcc/g++、gdb、makefile以及进度条小程序

文章目录 Ⅰ. Linux 软件包管理器 yum一、什么是软件包&#xff1f;二、查找软件包三、安装与卸载软件包 拓展&#xff1a;lrzsz简介拓&#xff1a;配置 yum 源路径的方法Ⅱ. Linux开发工具vim编辑器一、vim 的基本概念二、vim 的基本操作三、vim 命令模式的操作四、vim 底行模…

【大厂面试题】软件测试面试题整理(附答案)

以下面试题为最近大厂面试整理的内容&#xff0c;可供应届生参考。 目录 1. 实习期间用python写过哪些东西&#xff1f; 2. Opencv如何使&#xff1f; 3. 用Python写过什么&#xff0c;在大学期间是必修语言吗&#xff0c;当时考了多少分&#xff1f; 4. Python学下来比较困…