当前位置: 首页 > news >正文

C语言---插入排序、希尔排序、冒泡排序、选择排序、快速排序简单介绍

文章目录

  • 插入排序
  • 希尔排序
  • 冒泡排序
  • 选择排序
  • 快速排序

本文主要介绍用C语言实现的一些排序方法,有插入排序、希尔排序、冒泡排序、选择排序和快速排序,文章中给出的例子都是按照升序排列的。


插入排序

若数组只有一个元素,自然不用排序,插入排序从数组的第二个元素开始,先将当前的元素存起来,然后将它和前面的元素依次比较,大于它的元素依次向后移动,直到找到小于或等于它的元素,将存放的这个元素赋值给经过比较找到的数组位置中,就完成了一次插入排序,每完成一次插入排序,前面的(n+1)个数就已经是顺序的了,其中n为当前完成插入排序的次数。让一个有n个元素的数组顺序排列,需要n-1次插入排序。
插入排序的完整代码如下。

#include <stdio.h>
#include <stdlib.h>void print_array(int *a,int n)
{int i;for (i=0; i<n;i++)printf("%d ",a[i]);printf("\n");
}void InsertSort(int *a,int n)
{int i,j,temp;if(n==1){printf("After InsertSort array : \n");print_array(a,n);}for(i=1;i<n;i++){temp = a[i];   //保存当前值for(j=i-1;j>=0;j--){if(a[j] > temp)a[j+1] = a[j];   //前面的值比当前值大,向后移动elsebreak;      //找到了当前值该插入的位置}a[j+1] = temp;   //将当前值插入在找到的位置printf("After %d InsertSort array : ",i);print_array(a,n);if(i==n-1){printf("After InsertSort array : \n");print_array(a,n);}    }
}void main()
{int n,i;int *a;printf("Please input the number of the integer : ");scanf("%d",&n);a = (int*)malloc(n*sizeof(int));printf("Please input %d integer numbers : \n",n);for(i=0; i<n; i++)scanf("%d",&a[i]);printf("Original array : \n");print_array(a,n);InsertSort(a,n);
}

运行结果如下图所示。
在这里插入图片描述


希尔排序

希尔排序是比较特殊的插入排序,上面提到的插入排序每次的步长为1,希尔排序是将待排序列分为若干个子序列,对这些子序列分别进行插入排序,初始的步长是要排列元素数量的一半(取整),之后每次折半,最后一次排序是步长为1的插入排序。
希尔排序的完整代码如下。

#include <stdio.h>
#include <stdlib.h>void print_array(int *a,int n)
{int i;for (i=0; i<n;i++)printf("%d ",a[i]);printf("\n");
}void ShellSort(int *a,int n)
{int i,j,k,temp,gap;if(n==1)  //数组只有一个元素{printf("After ShellSort array : \n");print_array(a,n);}gap = n/2;   //初始值为数组长度的一半取整while(gap > 0)  //退出循环的条件是 gap = 0{for(i=0;i<gap;i++)    //i为每组第一个元素的下标{for(j=gap+i;j<n;j+=gap)  //j的初始值为每组第二个元素的下标{temp = a[j];   //保存需要插入的值for(k=j-gap;k>=0;k-=gap)   //从j的前一个元素j-gap开始比{if(a[k]>temp)a[k+gap] = a[k];  //注意gap的值elsebreak;}a[k+gap] = temp;  //插入到指定位置}}printf("After gap=%d ShellSort array : ",gap);print_array(a,n);gap = gap/2;   //gap的值在每次过后减半}printf("After ShellSort array : \n");print_array(a,n);
}void main()
{int n,i;int *a;printf("Please input the number of the integer : ");scanf("%d",&n);a = (int*)malloc(n*sizeof(int));printf("Please input %d integer numbers : \n",n);for(i=0; i<n; i++)scanf("%d",&a[i]);printf("Original array : \n");print_array(a,n);ShellSort(a,n);
}

运行结果如下图所示。
在这里插入图片描述


冒泡排序

冒泡排序相对比较简单,每趟冒泡排序从头开始,相邻两元素比大小,前面的元素比后面的元素大就交换,否则不交换继续往后比较,可以控制循环不用从头比较到尾,因为每经过一趟冒泡排序,所剩下元素中最大的数会被移动到数组末端,后面序列是有序的。
冒泡排序的完整代码如下。

#include <stdio.h>
#include <stdlib.h>void print_array(int *a,int n)
{int i;for (i=0; i<n;i++)printf("%d ",a[i]);printf("\n");
}void BubbleSort(int *a,int n)
{int i,j,temp;if(n==1)  //数组只有一个元素{printf("After BubbleSort array : \n");print_array(a,n);}for(i=0;i<n-1;i++)  //外层循环执行次数比元素个数小1{for(j=0;j<n-i-1;j++)  //内层循环每次执行的次数跟i值有关{if(a[j]>a[j+1]) //相邻元素做比较,根据比较结果决定交换与否{temp = a[j];a[j] = a[j+1];a[j+1] = temp;}}printf("After %d BubbleSort array : ",i+1);print_array(a,n);}printf("After BubbleSort array : \n");print_array(a,n);
}void main()
{int n,i;int *a;printf("Please input the number of the integer : ");scanf("%d",&n);a = (int*)malloc(n*sizeof(int));printf("Please input %d integer numbers : \n",n);for(i=0; i<n; i++)scanf("%d",&a[i]);printf("Original array : \n");print_array(a,n);BubbleSort(a,n);
}

运行结果如下图所示。
在这里插入图片描述


选择排序

选择排序就是在每一趟排序中找到剩余元素中的最小值,然后将其与数组中第n个元素(第n趟排序就是第n个元素)进行交换(如果最小的是自己,不用交换),为了优化,可以在一次循环中同时找到最大值和最小值分别交换,这样只需执行元素数量的一半即可完成最终排序。
选择排序的完整代码如下。

#include <stdio.h>
#include <stdlib.h>void print_array(int *a,int n)
{int i;for (i=0; i<n;i++)printf("%d ",a[i]);printf("\n");
}void SelectSort(int *a,int n)
{int i,j,k,min;if(n==1)  //数组只有一个元素{printf("After SelectSort array : \n");print_array(a,n);}for(i=0;i<n-1;i++)  //外层循环执行次数比元素个数小1{k = i;  min = a[i];  //选定当前值为最小值for(j=i+1;j<n;j++)  //内层循环每次执行的次数跟i值有关{if(a[j]<min)   //找出最小值的下标{min = a[j];  //更新当前最小值k = j;  //记录下标}  }if(k != i)   //当前元素不是最小值,交换{a[k] = a[i];a[i] = min;}printf("After %d SelectSort array : ",i+1);print_array(a,n);}printf("After SelectSort array : \n");print_array(a,n);
}void main()
{int n,i;int *a;printf("Please input the number of the integer : ");scanf("%d",&n);a = (int*)malloc(n*sizeof(int));printf("Please input %d integer numbers : \n",n);for(i=0; i<n; i++)scanf("%d",&a[i]);printf("Original array : \n");print_array(a,n);SelectSort(a,n);
}

运行结果如下图所示。在这里插入图片描述
在一趟排序中同时找出最大值和最小值进行替换,这种情况下一定要注意,如果最大值出现在当前最小值将要存放的位置,如果你先交换了最小值,那么在交换最大值时就会出现问题,一定要在代码中进行判断,如果最大值出现在当前最小值将要存放的位置,那么在先交换了最小值后,在交换最大值时需要和交换最小值的那个位置进行交换。
同时找出最大值和最小值的选择排序的完整代码如下。

#include <stdio.h>
#include <stdlib.h>void print_array(int *a,int n)
{int i;for (i=0; i<n;i++)printf("%d ",a[i]);printf("\n");
}void SelectSort(int *a,int n)
{int i,j,k,l,min,max;if(n==1)  //数组只有一个元素{printf("After SelectSort array : \n");print_array(a,n);}for(i=0;i<n/2;i++)  //外层循环执行次数是元素个数的一半{k = i;l = n-i-1;min = a[i];     //选定最小值max = a[n-i-1];  //选定最大值for(j=i;j<n-i;j++)  //内层循环每次执行的次数跟i值有关{if(a[j]<min)   //找出最小值的下标{min = a[j];  //更新当前最小值k = j;     //记录下标}else if(a[j]>max){max = a[j];l = j; }}if(k != i){a[k] = a[i];a[i] = min;}if(l != n-i-1)    {if(l != i){a[l] = a[n-i-1];a[n-i-1] = max;}else  //最大值位置已经被最小值填充,找到最大值被交换的位置再交换{a[k] = a[n-i-1];a[n-i-1] = max;}}printf("After %d SelectSort array : ",i+1);print_array(a,n);}printf("After SelectSort array : \n");print_array(a,n);
}void main()
{int n,i;int *a;printf("Please input the number of the integer : ");scanf("%d",&n);a = (int*)malloc(n*sizeof(int));printf("Please input %d integer numbers : \n",n);for(i=0; i<n; i++)scanf("%d",&a[i]);printf("Original array : \n");print_array(a,n);SelectSort(a,n);
}

运行结果如下图所示。
在这里插入图片描述


快速排序

快速排序需要选择一个基准值key,一般选择最左边的,定义两个下标值,一个是最左边值的一个是最右边值的下标low和high,每次开始的时候,high先往左边移动,遇到比key值小的就停下,然后low开始往右边移动,遇到比key值大的就停下,此时,如果low<high,就交换low和high下标对应的值,然后依然是high先移动,low后移动,当low=high时,将这个位置的值和key值进行交换。交换完成后,key值左边的值都已经比它小,右边的值都比它大,然后在左右两边再选择基准值递归。注意,在移动时,先移动的是远离key值的那个下标值。
快速排序的完整代码如下。

#include <stdio.h>
#include <stdlib.h>int n,count = 1;
void print_array(int *a,int n)
{int i;for (i=0; i<n;i++)printf("%d ",a[i]);printf("\n");
}void QuickSort(int *a,int low,int high)
{int key,temp;int start,end;if(low>=high)   //涉及递归,根据low和high的关系决定是否执行下面的代码return;start = low;  //记录起始位置end = high;key = a[low]; //基准值设定while(low < high){while(low < high && a[high] >= key)   //一定是大于等于high--;while(low < high && a[low] <= key)    //一定是小于等于low++;//low<high时交换low和high对应的值temp = a[high];    a[high] = a[low];a[low] = temp;}//退出循环即low=high,交换其与key的值temp = a[high];a[high] = key;a[start] = temp;printf("After %d QuickSort array : ",count);print_array(a,n);count++;QuickSort(a,start,low-1);  //一分为二进行递归QuickSort(a,low+1,end);
}void main()
{int i;int *a;printf("Please input the number of the integer : ");scanf("%d",&n);a = (int*)malloc(n*sizeof(int));printf("Please input %d integer numbers : \n",n);for(i=0; i<n; i++)scanf("%d",&a[i]);printf("Original array : \n");print_array(a,n);QuickSort(a,0,n-1);printf("After QuickSort array : \n");print_array(a,n);
}

运行结果如下图所示。
在这里插入图片描述
以上就是用C语言实现插入排序、希尔排序、冒泡排序、选择排序和快速排序的所有内容了!

相关文章:

C语言---插入排序、希尔排序、冒泡排序、选择排序、快速排序简单介绍

文章目录 插入排序希尔排序冒泡排序选择排序快速排序 本文主要介绍用C语言实现的一些排序方法&#xff0c;有插入排序、希尔排序、冒泡排序、选择排序和快速排序&#xff0c;文章中给出的例子都是按照升序排列的。 插入排序 若数组只有一个元素&#xff0c;自然不用排序&#…...

撸视频号收益这个副业靠谱吗?

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 昨天有个人问我说做视频号能月入过万吗? 我的回复是&#xff1a;99%的人不能。 但为什么会经常有人这么问呢&#xff0c;松松思考了一下&#xff0c;原因是最近很多人在晒视频号撸收益的项目&am…...

2、数组、Map+HashMap、Set+Hashset、Char和Character类、String类和Char类、Math类

数组 \\一个普通的长度为1的整数数组 Integer[] arr new Integer[1];\\一个普通长度为1的同时元素初始化为1的整数数组。 Integer[] arr new Integer[]{1};\\一个长度为0的空数组 Integer[] arr new Integer[0];Map 常见方法 void clear( ) 从此映射中移除所有映射关系&#…...

ESP8266 WiFi模块快速入门指南

ESP8266是一种低成本、小巧而功能强大的WiFi模块&#xff0c;非常适合于物联网和嵌入式系统应用。本指南将为您提供关于ESP8266 WiFi模块的快速入门步骤和基本知识。 第一步&#xff1a;硬件准备 首先&#xff0c;您需要将ESP8266 WiFi模块与您的开发板连接。通常情况下&#…...

微信小程序将后端返回的图片文件流解析显示到页面

说明 由于请求接口后端返回的图片格式不是一个完整的url,也不是其他直接能显示的图片格式&#xff0c;是一张图片 后端根据模板与二维码生成图片,返回二进制数据 返回为文件流的格式,用wx.request请求的时候&#xff0c;就自动解码成为了下面这样的数据数据格式,这样的数据没…...

网络基础(1)

目录&#xff1a; 1.了解局域网&#xff08;LAN&#xff09;和广域网&#xff08;WAN&#xff09; 2.认识“协议” 3.浅谈OSI七层模型 4.网络传输的基本流程 5.路由器这个设备 ---------------------------------------------------------------------------------------…...

flink的AggregateFunction,merge方法作用范围

背景 AggregateFunction接口是我们经常用的窗口聚合函数&#xff0c;其中有一个merge方法&#xff0c;我们一般情况下也是实现了的&#xff0c;但是你知道吗&#xff0c;其实这个方法只有在你使用会话窗口需要进行窗口合并的时候才需要实现 AggregateFunction.merge方法调用时…...

Day25力扣打卡

打卡记录 寻找旋转排序数组中的最小值&#xff08;二分&#xff09; 链接 由于是旋转排序数组&#xff0c;所以整个数组有两部分是递增的&#xff0c;选取右侧最后元素&#xff0c;即可将整个数组分为大于该元素和小于该元素&#xff0c;碰头地段即为最小值。 class Solutio…...

SpringCloud - OpenFeign 参数传递和响应处理(全网最详细)

目录 一、OpenFeign 参数传递和响应处理 1.1、feign 客户端参数传递 1.1.1、零散类型参数传递 1. 例如 querystring 方式传参 2. 例如路径方式传参 1.1.2、对象参数传递 1. 对象参数传递案例 1.1.3、数组参数传递 1. 数组传参案例 1.1.4、集合类型的参数传递&#xf…...

Postgresql数据类型-布尔类型

前面介绍了PostgreSQL支持的数字类型、字符类型、时间日期类型&#xff0c;这些数据类型是关系型数据库的常规数据类型&#xff0c;此外PostgreSQL还支持很多非常规数据类型&#xff0c;比如布尔类型、网络地址类型、数组类型、范围类型、json/jsonb类型等&#xff0c;从这一节…...

SPASS-交叉表分析

导入数据 修改变量测量类型 分析->描述统计->交叉表 表中显示行、列变量通过卡方检验给出的独立性检验结果。共使用了三种检验方法。上表各种检验方法显著水平sig.都远远小于0.05,所以有理由拒绝实验准备与评价结果是独立的假设&#xff0c;即认为实验准备这个评价指标是…...

用Python的requests库来模拟爬取地图商铺信息

由于谷歌地图抓取商铺信息涉及到API使用和反爬虫策略&#xff0c;直接爬取可能会遇到限制。但是&#xff0c;我们可以使用Python的requests库来模拟爬取某个网页&#xff0c;然后通过正则表达式或其他文本处理方法来提取商铺信息。以下是一个简单的示例&#xff1a; # 导入requ…...

使用EvoMap/Three.js模拟无人机灯光秀

一、创建地图对象 首先我们需要创建一个EM.Map对象&#xff0c;该对象代表了一个地图实例&#xff0c;并设置id为"map"的文档元素作为地图的容器。 let map new EM.Map("map",{zoom:22.14,center:[8.02528, -29.27638, 0],pitch:71.507,roll:2.01,maxPit…...

11.9存储器实验总结(单ram,双ram,FIFO)

实验设计 单端口RAM实现 双端口RAM实现 FIFO实现 文件结构为...

linux(ubuntu)安装并使用scrcpy

scrcpy 是一款开源的在计算机上显示和控制 Android 设备的工具。要在 Ubuntu 上使用 scrcpy&#xff0c;你可以按照以下步骤进行安装&#xff1a; 通过命令行安装 scrcpy&#xff1a; 安装 scrcpy&#xff1a; 打开终端&#xff08;Terminal&#xff09;并执行以下命令来安装…...

linux rsyslog安装配置

syslog是Linux系统默认的日志守护进程。默认的syslog配置文件是/etc/rsyslog.conf文件。syslog守护进程是可配置的,它允许人们为每一种类型的系统信息精确地指定一个存放地点。syslog使用UDP 514/TCP 514端口。 1.环境信息 环境信息 HostnameIpAddressOS versionModuleNoterh…...

美国Embarcadero公司正式发布2023 RAD Studio Delphi C++ Builder 12 Athens

Embarcadero 非常高兴地宣布发布 RAD Studio 12 Athens 以及 Delphi 12 和 CBuilder 12。RAD Studio 12 Athens 版本包含令人兴奋的新功能&#xff0c;为该产品的未来奠定了基础。 目录 主要新功能 C 的奇妙之处Delphi 的一些不错的补充FireMonkey 和 Skia 作为新基金会采用 MD…...

树莓派4B的测试记录(CPU、FFMPEG)

本文是用来记录树莓派 4B 的一些测试记录。 温度 下面记录中的风扇和大风扇是这样的&#xff1a; 为什么要用大风扇呢&#xff1f;因为小风扇在外壳上&#xff0c;气流通过外壳的珊格会有啸叫&#xff0c;声音不大但是很烦人&#xff0c;大风扇没这个问题&#xff0c;并且同样…...

物联网AI MicroPython学习之语法 二进制与ASCII转换

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; ubinascii 介绍 ubinascii模块实现了二进制数据与各种ASCII编码之间的转换。 接口说明 a2b_base64 - 解码base64编码的数据 函数原型&#xff1a;ubinascii.a2b_base64(data)注意事项&#xff1a; 在解码…...

学之思项目的搭建部署 打jar包失败的解决方法

学之思系统介绍部署java环境安装maven安装node.js前端打包工具命令npmGit命令获取源代码安装配置mysql前端打包打包jar包服务上线!!!打jar包失败的解决方法 学之思系统介绍 学之思开源考试系统是一款 java vue 的前后端不分离的考试系统。主要优点是开发、部署简单快捷、界面…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

Razor编程中@Html的方法使用大全

文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...

HTML前端开发:JavaScript 获取元素方法详解

作为前端开发者&#xff0c;高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法&#xff0c;分为两大系列&#xff1a; 一、getElementBy... 系列 传统方法&#xff0c;直接通过 DOM 接口访问&#xff0c;返回动态集合&#xff08;元素变化会实时更新&#xff09;。…...