三种常用的排序方法图解及C语言实现(选择排序,冒泡排序,快速排序)

2023-11-12

选择排序

选择排序是最简单直观的一种算法,选择排序是不稳定排序。

基本思想:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾
以此类推,直到所有元素均排序完毕。

在算法实现时,每一趟确定最小元素的时候会通过不断地比较交换来使得首位置为当前最小,交换是个比较耗时的操作。其实我们很容易发现,在还未完全确定当前最小元素之前,这些交换都是无意义的。我们可以通过设置一个变量min,每一次比较仅存储较小元素的数组下标,当轮循环结束之后,那这个变量存储的就是当前最小元素的下标,此时再执行交换操作即可。
在这里插入图片描述

选择排序模板
在这里插入图片描述
实现代码

#include <stdio.h>
int main()
{
 	int a[100],i,j,t,n,min;
 	scanf("%d",&n); //输入一个数n,表示接下来有n个数
 	for(i=1;i<=n;i++) //循环读入n个数到数组a中
 		scanf("%d",&a[i]); 
 	//选择排序的核心部分
	for(i=1;i<n;i++) //n个数排序,只用进行n-1趟
	{
		min = i;//查找最小值 
		for(j=i+1;j<=n;j++) 
		{
	    	if(a[min] > a[j])  
	            min = j;  
        	if(min != i)//交换    
	        {  
	            t = a[min];  
	            a[min] = a[i];  
	            a[i] = t;  
	        }  
	    } 
	    
	}
	for(i=1;i<=n;i++) //输出结果
	 	printf("%d ",a[i]);

 return 0;
} 

冒泡排序

冒泡排序的基本思想是,每趟对相邻的元素进行两两比较,并按“前小后大” 规则交换,这样,每一趟会将最小或最大的元素“浮”到顶端,最终达到完全有序
在这里插入图片描述
冒泡排序模板:

#include <stdio.h>
int main()
{
 	int a[100],i,j,t,n;
 	scanf("%d",&n); //输入一个数n,表示接下来有n个数
 	for(i=1;i<=n;i++) //循环读入n个数到数组a中
 		scanf("%d",&a[i]); 
 	//冒泡排序的核心部分
	for(i=1;i<=n-1;i++) //n个数排序,只用进行n-1趟
	{
		for(j=1;j<=n-i;j++) //从第1位开始比较直到最后一个尚未归位的数,想一想为什么到n-i就可以了。
		{
			if(a[j]<a[j+1]) //比较大小并交换
			{ 
				t=a[j]; 
				a[j]=a[j+1]; 
				a[j+1]=t; 
			}
		}
	}
	for(i=1;i<=n;i++) //输出结果
	 	printf("%d ",a[i]);

 getchar();getchar();
 return 0;
} 

快速排序

基本思想:
将一组要排序的数列分成两部分,其中一部分的值都比另一部分的小;然后按照这个方法分别对两部分数据进行快速排序,整个过程可以用递归进行,从而实现整个数列的排序。

  • 步骤1:首先取数组的第一个元素作为基准数temp = a[low], 设置两个指针i和j,i = low, j = high;
  • 步骤2:从右向左扫描(即 j不断向左移动),找到小于基准数temp的数,如果找到的话,a[i] 和a[j]交换,i++;(这一步其实就是将比基准数小的数移动到基准数左边)
  • 步骤3:从左向右扫描(即 i不断向右移动),找到大于基准数temp的数,如果找到的话,a[i] 和 a[j]交换,j–;(这一步其实就是将比基准数大的数移动到基准数右边) 步骤4:重复步骤2~步骤3,直到i>=j 。
  • 至此基准数temp左边的数的小于它,右边的数都大于它。再调用函数分别对于左右两边分别进行快速排序重复步骤1,2,3,4;(递归实现)

在这里插入图片描述

实现代码

#include <stdio.h>
int a[101],n;//定义全局变量,这两个变量需要在子函数中使用
void quickSort(int low, int high)
{
        int mid;
        if(low<high) 
		{
            int i = low;
	        int j = high;
	        int temp = a[low];//temp中存的就是基准数
	        while(i < j) {
	            while(i < j && a[j] > temp)//向左边搜索
	                j--;
	            if(i<j) //交换两个数在数组中的位置
				{
	                int t = a[j];
				        a[j] = a[i];
				        a[i] = t;
	                i++;
	            }
	            while(i<j && a[i]<temp)//向右边搜索
	                i++;
	            if(i<j) //交换两个数在数组中的位置
				{
	                int t = a[j];
				        a[j] = a[i];
				        a[i] = t;
	                j--;
	            }
	        }
            quickSort(low,i-1);//继续处理左边的
            quickSort(i+1,high);//继续处理右边的
        }
}

int main()
{
	int i,j,t;
	//读入数据
	scanf("%d",&n);
	for(i=1;i<=n;i++)
		scanf("%d",&a[i]);
	quickSort(1,n); //快速排序调用
	//输出排序后的结果
	for(i=1;i<=n;i++)
		printf("%d ",a[i]);
	getchar();getchar();
	return 0;
} 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

三种常用的排序方法图解及C语言实现(选择排序,冒泡排序,快速排序) 的相关文章

随机推荐

  • LeetCode每日一练 —— 88. 合并两个有序数组

    前言 Wassup guys 我是Edison 今天是 LeetCode 上的 leetcode 88 合并两个有序数组 Let s get it 文章目录 1 题目分析 2 题目图解 思路一 思路二 3 代码实现 1 题目分析 给你两个按
  • ENU、EPSG、ECEF坐标系科普(三维重建)

    科普一 ENU和EPSG实际上代表了两个不同的概念 这两者并不是直接对比的 1 ENU坐标系 ENU坐标系是一种本地切面坐标系 用于表示与地理位置相关的空间数据 在ENU坐标系中 E代表东 East N代表北 North U代表上 Up 它
  • LeetCode 406. Queue Reconstruction by Height 解题报告

    LeetCode 406 Queue Reconstruction by Height 解题报告 题目描述 Suppose you have a random list of people standing in a queue Each
  • 算法—反转链表

    题目 实现单链表的逆转函数 输入一个链表 反转链表后 返回翻转之后的链表 分析 利用三个指针 head node nodeNext node指向当前结点 head指向当前结点的前一个结点 nodeNext指向当前结点的后一个结点 先将hea
  • 浏览器动态显示服务器日志,基于 websocket 实现远程实时日志 在浏览器中查看设备的运行日志...

    本文介绍一个基于websocket实现的远程实时日志系统 可以通过浏览器查看远程移动设备的实时运行日志 系统由三个部分组成 1 服务器 与移动设备和浏览器建立websocket连接 将移动设备websocket上读取的实时日志转发到对应的浏
  • 每日算法-回文链表

    题目 请判断一个链表是否为回文链表 示例 1 输入 1 gt 2 输出 false 示例 2 输入 1 gt 2 gt 2 gt 1 输出 true 进阶 你能否用 O n 时间复杂度和 O 1 空间复杂度解决此题 解法 思路一 先把链表的
  • QGIS自定义地图工具

    官方示例 首先看一下官方文档中的矩形工具源码 class RectangleMapTool QgsMapToolEmitPoint def init self canvas self canvas canvas QgsMapToolEmit
  • fatal: pathspec ‘fileName‘ did not match any files 解决办法

    再删除文件的时候突然出现了这个问题 fatal pathspec fileName did not match any files 分析如下 这个文件怎么回事 为什么删不掉 难道是分支的错误 还是怎么回事 产生原因 该文件存在于 gitig
  • C语言----实现有向图/无向图的创建与基本操作(深度、广度优先遍历)

    最近发现一个不错的项目 Github上数据结构所有算法源码实现 数据结构 严蔚敏 吴伟民 教材源码与习题解析 1 图的数组 邻接矩阵 存储表示 包含算法 有向图 无向图创建 添加顶点 删除边 插入边 深度优先遍历 递归 广度优先遍历 队列实
  • 跨平台的桌面应用程序开发框架Electron

    electron electron Stars 109 3k License MIT Electron 是一个基于 Node js 和 Chromium 的开源框架 允许使用 JavaScript HTML 和 CSS 编写跨平台的桌面应用
  • Elasticsearch系列---聚合查询原理

    概要 本篇主要介绍聚合查询的内部原理 正排索引是如何建立的和优化的 fielddata的使用 最后简单介绍了聚合分析时如何选用深度优先和广度优先 正排索引 聚合查询的内部原理是什么 Elastichsearch是用什么样的数据结构去执行聚合
  • linux 下交换 esc与cap的方法。

    有两种方法 1 xmodmap 2 dconf editer 操作如下图所示 xkb options 改为图片所示
  • STM32项目 -- 选题分享(部分)

    前言 分享部分STM32项目选题以及实现效果 暂时没有分享代码 列表 编号 项目名称 难度 使用器件 实现效果 1 基于STM32的智能万用表设计 3 STM32F103C8T6 OLED 1 测量电压 2 OLED显示测量值 3 实现层级
  • ASP.NET-----Repeater数据控件的用法总结

    一 Repeater控件的用法流程及实例 1 首先建立一个网站 新建一个网页index aspx 2 添加或者建立APP Data数据文件 然后将用到的数据库文件放到APP Data文件夹中 3 打开数据库企业管理器 数据库服务器为loca
  • 【帧同步】关于状态同步的经验分享

    方案 低延迟环境下 比如国内 局域网情况下 写个同步那都不是难事 是个客户端看点书就会写了 难点在于 如何去处理 高延迟 以及及时响应的情况 我举个例子 fps或者tank游戏中 子弹和炮弹的射速是很快的 如果两边在对轰过程中 又碰到了 附
  • Qt (ui界面)信号与槽函数 组件连接

    重点 信号与槽连接机制 难点 信号与槽函数的 参数使用 头函数 ifndef WIDGET H define WIDGET H include
  • 登录页面,表单提交,参数不显示

    一开始的form
  • curl下载文件

    我的个人博客 逐步前行STEP curl url o filename progress 下载url的内容到文件filename中 并显示下载进度
  • 深度学习面试八股文(2023.9.06)

    一 优化器 1 SGD是什么 批梯度下降 Batch gradient descent 遍历全部数据集算一次损失函数 计算量开销大 计算速度慢 不支持在线学习 随机梯度下降 Stochastic gradient descent SGD 每
  • 三种常用的排序方法图解及C语言实现(选择排序,冒泡排序,快速排序)

    选择排序 冒泡排序 快速排序 选择排序 选择排序是最简单直观的一种算法 选择排序是不稳定排序 基本思想 首先在未排序序列中找到最小 大 元素 存放到排序序列的起始位置 然后 再从剩余未排序元素中继续寻找最小 大 元素 然后放到已排序序列的末