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

排序算法总结(一)冒泡排序和选择排序

访问www.tomcoding.com网站,学习Oracle内部数据结构,详细文档说明,下载Oracle的exp/imp,DUL,logminer,ASM工具的源代码,学习高技术含量的内容。

冒泡排序

这个算法可以说是排序算法中最著名的一个了,名字独特,也好理解,在一个数组中有n个元素,扫描整个数组中没有排序的元素,从第一个元素开始,每个元素与它后面的元素比较,数值小的放在前面,数值大的放在后面,那么经过第一轮扫描,最大的数值就放在了数组最后的位置,就像每个元素是一个气泡,最大的气泡最先浮到数组顶端。第二轮扫描,由于最大的元素已经找到,需要找第二大的元素,这时扫描的元素个数少了一个,变为n-1,经过第二轮扫描,第二大的元素放到了数组倒数第二的位置。依次类推,第三次扫描元素个数变为n-2,第三大的元素排到了倒数第三的位置。这样每次扫描的元素越来越少,最后扫描到未排序的元素只有一个时,排序就结束了,这时数组中的数值按照升序排列好了。

第0轮:扫描n-1个元素,从0开始到n-2,每个元素j与后一个元素j+1比较,小的在前,大的在后,如果不一致时,要把这两个元素交换位置。

第1轮:扫描n-2个元素,从0开始到n-3,每个元素j与后一个元素j+1比较。

第2轮:扫描n-3个元素,从0开始到n-4,每个元素j与后一个元素j+1比较。

第3轮:扫描n-4个元素,从0开始到n-5,每个元素j与后一个元素j+1比较。

……

第n-2轮:扫描1个元素,第0个和第1个元素比较。

第n-1轮:扫描0个元素,结束。其实在上一轮比较完,就可以结束了。

用C语言编写一个函数实现冒泡排序算法,i表示扫描的轮的序号,j表示每一轮中扫描的元素序号(数组下标)。

/* ai是要排序的整数数组指针

 *  n是数组中元素的个数

 */

void bubble_sort(int *ai, int n)

{

    int         i, j, k;

    /* 循环n-1轮 */

    for (i = 0; i < (n-1); i++) {

        /* 每一轮,扫描n-1-i个元素 */

        for (j = 0; j < (n-1-i); j++) {

            if (ai[j] > ai[j+1]) {

                /* 前一个元素比后一个大,交换位置,否则不用交换 */

                k       = ai[j];

                ai[j]   = ai[j+1];

                ai[j+1] = k;

            }

        }

    }

}

选择排序

这个也是经常用到的排序算法,甚至是最容易想到的算法,虽然不好确定它的名字。工作原理如下,把要排序的数组分成两部分,第一部分是排过序的元素集合,第二部分是没有排过序的元素集合,开始时第一部分的元素个数为0,第二部分为全部元素,算法要进行多轮选择,每一轮选择都是从第二部分元素中找到最小的元素,把这个元素放到第一部分的末尾,这样经过多轮选择后,第一部分越来越大,第二部分越来越小,当第二部分元素数为0时,排序就结束了。

实现算法时也有两个关键点要确定,第一个是循环的轮数,假设数组中元素的个数是n,每一轮要找到一个最小数据,所以原则上应该找n轮,其实找到n-1轮时,最后一轮就剩下一个元素了,没有比较的必要了,所以循环的轮数为n-1。第二个是每轮查找元素的个数,看下表。

第0轮,扫描n-0个元素,从0到n-1

第1轮,扫描n-1个元素,从1到n-1

第2轮,扫描n-2个元素,从2到n-1

第3轮,扫描n-3个元素,从3到n-1

……

第n-2轮,扫描2个元素,从n-2到n-1

第n-1轮,扫描1个元素,从n-1到n-1

用C语言写一个函数实现这个算法。

/* ai 是要排序的整数数组

 *  n 是数组中元素的个数

 *

 * 函数中i,j是计数变量

 * min_index是第二部分数组中最小值的元素下标

 * min变量暂存第二部分中最小值

 * tail是第一部分的尾部位置

 * start是第二部分开始扫描的起始位置

 */

static void selection_sort(int *ai, int n)

{

    int         i, j, k, min_index;

    int         min;

    int         tail;

    int         start;

    /* 开始时,第一部分没有元素,尾部在第0个元素 */

    tail = 0;

    for (i = 0; i < (n-1); i++) {

        start = tail;

        min   = ai[start];

        min_index = -1;

        for (j = start; j < n; j++) {

            if (ai[j] < min) {

                min_index = j;

                min = ai[j];

            }

        }

        if (min_index != -1) {

            /* 找到了最小值,交换元素 */

            k             = ai[tail];

            ai[tail]      = ai[min_index];

            ai[min_index] = k;

        }

        tail++;

    }

}

这个函数看起来有些复杂,我们来简化一下。从上面看tail其实就是i的位置,start是i的下一个位置,min值是扫描第二部分的第一个元素,把这些简化后,得到下面的函数。

void selection_sort(int *ai, int n)

{

    int         i, j, k;

    int         min_index;

    for (i = 0; i < (n-1); i++) {

        min_index = i;

        for (j = i+1; j < n; j++) {

            if (ai[j] < ai[min_index])

                min_index = j;

        }

        if (min_index != i) {

            /* 交换元素 */

            k             = ai[i];

            ai[i]         = ai[min_index];

            ai[min_index] = k;

        }

    }

}

检查排序结果

写一个函数来检查一下排序后的元素顺序有没有错误,方法很简单,在数组中遍历一次,看看前一个元素是否比后一个元素大,如果大就说明排序出错了。

void check_result(int *ai, int n)

{

    int         i;

    for (i=0; i<n-1; i++) {

        if (ai[i] > ai[i+1]) {

            fprintf(stderr, "error, element[%d]=%d, element[%d]=%d\n\n", i, ai[i], i+1, ai[i+1]);

            return;

        }

    }

    fprintf(stdout, "element is sorted.\n\n");

}

写一个程序测试一下排序结果。

int main(int argc, char *argv[])

{

    static int  chaos[16] = {23, 6, 235, 89, 4, 12, 76, 35, 129, 30, 77, 15, 61, 44, 49, 88};

    int         array[16];

    fprintf(stdout, "test for bubble_sort function.\n\n");

    memcpy(array, chaos, 16*sizeof(int));

    bubble_sort(array, 16);

    check_result(array, 16);

    fprintf(stdout, "test for selection_sort function.\n\n");

    memcpy(array, chaos, 16*sizeof(int));

    selection_sort(array, 16);

    check_result(array, 16);

    return (0);

}

相关文章:

排序算法总结(一)冒泡排序和选择排序

访问www.tomcoding.com网站&#xff0c;学习Oracle内部数据结构&#xff0c;详细文档说明&#xff0c;下载Oracle的exp/imp&#xff0c;DUL&#xff0c;logminer&#xff0c;ASM工具的源代码&#xff0c;学习高技术含量的内容。 冒泡排序 这个算法可以说是排序算法中最著名的…...

伺服电动缸

美国EXLAR原装K系列伺服缸 高精度运动&#xff0c;运动平稳&#xff0c;低噪音&#xff0c;高速度 向下翻动查看更多 力姆泰克伺服电动缸 k系列电动缸采用Exlar滚柱丝杠技术&#xff0c;提供多种不同性能等级的产品&#xff0c;可外配第三方电机。 通用型设计&#xff0c;无…...

深度学习中的logit到底是什么?

1. 问题 在做深度学习的过程中&#xff0c;经常会碰到logit。这个和在学校学的概率有出入&#xff0c;因而想弄明白这到底是个什么参数。 2. 使用logit的原因 定义几率&#xff08;odds&#xff09;和 logit 函数的主要原因在于使用了线性空间转换&#xff0c;使得非线性的概…...

idea使用记录

文章目录 1、idea调出maven窗口2、跳转到指定行 1、idea调出maven窗口 首先尝试菜单栏View→Tool Windows→Maven&#xff0c;如果没有maven那很有可能是idea没有识别到这是一个maven项目&#xff0c;此时可以尝试在项目的pom文件上右击&#xff0c;选择“add as maven projec…...

Python - HTTP servers

python的http.server模块用于HTTP服务器的功能&#xff0c;这个模块是python标准库的一部分&#xff0c;不需要pip install。 使用前需要import&#xff1a; import http.server 然后就可以编辑代码&#xff0c;使用此模块提供的接口&#xff0c;实现http server相关功能。 除…...

内网Debian\Ubuntu服务器安装dep包,基于apt-rdepends下载相关依赖

文章目录 背景一、下载依赖二、拷贝到内网三、 使用dpkg安装可能会遇到的问题 背景 由于生产服务器是Debian\Ubuntu系统且在内网环境&#xff08;不联网&#xff09;&#xff0c;需要使用拷贝deb格式的包使用dpkg的方式进行安装。所以&#xff0c;需要现在联网的环境中将所需的…...

大模型——如何实现超长多轮对话

在自然语言处理的领域中&#xff0c;多轮对话系统是构建智能化交互应用的关键。无论是聊天机器人、虚拟助手&#xff0c;还是客户服务系统&#xff0c;能够保持连贯的对话并记住上下文信息是用户体验的核心。然而&#xff0c;大规模语言模型&#xff08;如GPT等&#xff09;的对…...

大数据面试-笔试SQL

一个表table: c_id u_id score&#xff1b;用SQL计算每个班级top5学生的平均分&#xff08;腾讯&#xff09; select class_id,avg(score) as score_avg from (select *,row_number() over(partition by class_id order by score desc) as score_rank from table ) t1 where t…...

希尔排序和直接插入排序

因为排序这些比较复杂点我就分几期给大家来讲~~~ 直接插入排序 直接插入排序是一种简单的排序算法&#xff0c;主要用于对少量数据进行排序。其基本思想是将待排序的元素逐个插入到已经排好序的部分中&#xff0c;从而形成一个有序序列。 具体步骤如下&#xff1a; 初始化&…...

IDEA 配置 Git 详解

本文将介绍在IntelliJ IDEA 中如何配置Git 没有安装配置 Git 的可以参考我的这篇文章&#xff1a;安装配置 Git 一、操作环境及准备 1.win 10 2.已安装且配置了Git 3.有Gitee账户 4.安装了IntelliJ IDEA 2023.2.1 5.全程联网 二、配置步骤 2.1 配置git 1.采用全局设置&…...

Docker 部署 Redis 监控系统实战:Redis Exporter 与 Prometheus 完整配置指南

Docker 部署 Redis 监控系统实战&#xff1a;Redis Exporter 与 Prometheus 完整配置指南 文章目录 Docker 部署 Redis 监控系统实战&#xff1a;Redis Exporter 与 Prometheus 完整配置指南一 缓存简述二 redis exporter 部署三 环境变量配置四 修改文件权限五 验证 exporter …...

高级算法设计与分析-MaxFlow网络流基础知识

MaxFlow网络流 1 网络流基础概念 source:源点 sink:终点 Flow:流量 capacity:容量 Residual:残量 Residual Network:残量网络 Augmenting path:增广路径,表示从源点 s 到终点 t 不包含环的路径 Bottleneck capacity:瓶颈容量 2 最大流 2.1 基础概念 2.2 增广路算法 …...

Java项目实战II基于Java+Spring Boot+MySQL的桂林旅游景点导游平台(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者 一、前言 桂林&#xff0c;以其独特的喀斯特地貌、秀美的自然风光闻名遐迩&#xff0c;每年吸引着无数国内外游…...

C语言-输入输出

实验一&#xff1a;编写一个输出两行自定义字符的 C 程序 一、实验目的 熟悉 C 语言的基本结构和语法。掌握 printf() 函数的使用方法。了解在 Code::Blocks 中编写、编译和运行程序的过程。 二、实验内容 编写一个 C 程序&#xff0c;要求输出两行字符&#xff0c;内容自定…...

如何在GitHub上传自己的项目?(一文看懂,每一步的操作和解决常见错误的方法)

目录 步骤一&#xff1a;准备 Git 环境 1. 安装 Git 2. 配置 Git 步骤二&#xff1a;在 GitHub 创建一个新的仓库 1. 登录到你的 GitHub 账号。 2. 点击右上角的 号&#xff0c;然后选择 New repository。 3. 填写以下信息&#xff1a; 步骤三&#xff1a;将本地项目上…...

数据结构_day1

目录 大纲 1.数据结构基础知识 1.1 什么是数据结构 1.2 数据 1.3 逻辑结构 1.4 存储结构 1.4.1 顺序存储 1.4.2 链式存储 1.4.3 索引存储结构 1.4.4 散列存储 1.5 操作 2.算法基础知识 2.1 什么是算法 2.2 算法的设计 2.3 算法的特性 2.4 评价算法的好坏 大纲 数据结构、算法(理…...

c# using 声明进行资源管理

在 C# 8 中&#xff0c;using 声明引入了一种新的语法&#xff0c;称为 using 声明&#xff0c;它使得开发人员在处理资源时的代码更加简洁和清晰。主要的变化包括 使用声明 和 使用上下文&#xff08;using declaration&#xff09; 的引入。 使用语句的简化 在 C# 8 中&…...

Kafka之基本概念

1、Kafka是什么&#xff1f; Kafka是由Scala语言开发的一个多分区、多副本&#xff0c;基于Zookeeper集群协调的系统。 那这个所谓的系统又是什么系统呢&#xff1f; 回答这个问题要从发展的角度来看&#xff1a;起初Kafka的定位是分布式消息系统。但是目前它的定位是一个分布…...

倪师学习笔记-天纪-斗数简介

一、学习过程 学习->验证->思考 二、算命方法 算命方法特点铁板神数适合核对六亲子平法准确度一般紫微斗数天文地理融合最好&#xff0c;批六亲不准&#xff0c;配合相可以提升准确率 三、果 天地人三者一起影响果&#xff0c;天时地利人和促成成功1/31/31/31算命部…...

Python酷库之旅-第三方库Pandas(143)

目录 一、用法精讲 646、pandas.Timestamp.is_quarter_start属性 646-1、语法 646-2、参数 646-3、功能 646-4、返回值 646-5、说明 646-6、用法 646-6-1、数据准备 646-6-2、代码示例 646-6-3、结果输出 647、pandas.Timestamp.is_year_end属性 647-1、语法 647…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...