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

数据结构--》掌握数据结构中的排序算法

        当我们面对海量数据时,如何高效地将其排序是数据结构领域中一个重要的问题。排序算法作为其中的关键部分,扮演着至关重要的角色。

        无论你是初学者还是进阶者,本文将为你提供简单易懂、实用可行的知识点,帮助你更好地掌握排序算法在数据结构和算法中的重要性,进而提升算法解题的能力。接下来让我们开启数据结构与算法的奇妙之旅吧。

        当我们需要对一组数据进行排序时,就需要使用排序算法。通常情况下,我们会将一组数据按照一定的规则进行排列,从而使其更易于查找和处理。

        常见的排序算法包括冒泡排序插入排序选择排序希尔排序归并排序快速排序等等。这些算法都有各自的优缺点,不同的应用场景适用不同的算法。因此,在实际开发中需要根据具体情况进行选择。接下来根据考研的大纲要求,着重对相关排序算法进行相应的讲解:

目录

插入排序

交换排序

选择排序

归并排序

基数排序


插入排序

算法思想:每次将一个待排序的记录按其关键字大小插入到前面已排好序的子序列中,直到全部记录插入完成。其实现的过程大致如下:

1)从第一个元素开始,认为它是已排序的区间。

2)取出下一个元素,在已经排好序的元素序列中从后向前扫描。

3)如果该元素(已排序)大于新元素,将该元素移到下一个位置。

4)重复步骤 3 直到找到已经排序的元素小于或者等于新元素的位置。

5)将新元素插入到该位置中。

用c语言实现插入排序算法:

void insertionSort(int arr[], int n) {int i, key, j;for (i = 1; i < n; i++) {key = arr[i];j = i - 1;while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j = j - 1;}arr[j + 1] = key;}
}

回顾重点,其主要内容整理成如下内容:

希尔排序:是一种基于插入排序的排序算法,也被称为缩小增量排序。它通过将待排序的元素分组,然后依次对每组的元素进行插入排序,最后再对整个序列进行一次插入排序。如下:

对生成的子表进行直接插入排序得到的结果如下:

直到d等于1的时候,得到的排序结果基本有序,然后进行直接插入排序得到最后的结果。

最终呈现的过程结果如下:

用c语言实现希尔排序算法: 

#include <stdio.h>void shellSort(int arr[], int n) {// 定义增量序列int gap, i, j, temp;for (gap = n / 2; gap > 0; gap /= 2) {// 内部使用插入排序对每个子序列进行排序for (i = gap; i < n; i++) {temp = arr[i];j = i;while (j >= gap && arr[j - gap] > temp) {arr[j] = arr[j - gap];j -= gap;}arr[j] = temp;}}
}int main() {int arr[] = {9, 5, 2, 7, 1, 8};int n = sizeof(arr) / sizeof(arr[0]);printf("原始数组:");for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}shellSort(arr, n);printf("\n排序后数组:");for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}return 0;
}

回顾重点,其主要内容整理成如下内容:

交换排序

交换排序是一种比较简单直观的排序算法,其主要思想是通过交换数组中相邻且不符合顺序要求的元素,将最大或最小的元素逐步“冒泡”到正确的位置。常用的交换排序算法有冒泡排序快速排序,下面将着重讲解一下这两种排序的相关实现:

冒泡排序:最基础的交换排序算法,其核心思想是从左到右,依次比较相邻的元素,将较大的元素交换到后面。该算法重复多次,每次将一个未排序的元素放到正确的位置,直到整个数组有序。冒泡排序的时间复杂度为 O(n^2)。

前后数值进行对比,小的前大的后,然后重复多次,直到将顺序从小到大弄出来

用c语言实现冒泡排序算法:  

#include <stdio.h>void bubbleSort(int arr[], int n) {int i, j, temp;for (i = 0; i < n-1; i++) {for (j = 0; j < n-i-1; j++) {if (arr[j] > arr[j+1]) {// 交换相邻元素temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}
}int main() {int arr[] = {9, 5, 2, 7, 1, 8};int n = sizeof(arr) / sizeof(arr[0]);printf("原始数组:");for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}bubbleSort(arr, n);printf("\n排序后数组:");for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}return 0;
}

回顾重点,其主要内容整理成如下内容:

快速排序:是一种分治思想的排序算法,它将问题分割成较小的子问题,然后递归地求解这些子问题。在快速排序中,通过一趟排序将待排序的记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,然后再按此方法对两部分记录进行排序,递归地进行下去,直到整个序列有序。快速排序的平均时间复杂度为 O(n log n),最坏情况下时间复杂度为 O(n^2)。

用c语言实现快速排序算法:   

#include <stdio.h>// 交换数组中两个元素的值
void swap(int* a, int* b) {int temp = *a;*a = *b;*b = temp;
}// 将基准元素放在正确的位置,并返回该位置的索引
int partition(int arr[], int low, int high) {int pivot = arr[high];  // 将最后一个元素设为基准元素int i = (low - 1);  // i 初始化为最低索引的前一个for (int j = low; j <= high - 1; j++) {if (arr[j] < pivot) {i++;  // 找到一个比基准元素小的元素,将 i 向后移动swap(&arr[i], &arr[j]);  // 交换 arr[i] 和 arr[j]}}swap(&arr[i + 1], &arr[high]);  // 将基准元素放置在正确的位置return (i + 1);
}// 快速排序函数
void quickSort(int arr[], int low, int high) {if (low < high) {// 将基准元素放置在正确的位置int pi = partition(arr, low, high);// 递归调用快速排序函数quickSort(arr, low, pi - 1);  // 对基准元素左侧的子数组进行排序quickSort(arr, pi + 1, high);  // 对基准元素右侧的子数组进行排序}
}// 打印数组元素
void printArray(int arr[], int size) {for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");
}int main() {int arr[] = {9, 5, 2, 7, 1, 8};int n = sizeof(arr) / sizeof(arr[0]);printf("原始数组:");printArray(arr, n);quickSort(arr, 0, n - 1);printf("排序后数组:");printArray(arr, n);return 0;
}

回顾重点,其主要内容整理成如下内容: 

选择排序

选择排序是一种简单直观的排序算法,它的基本思路是每次从未排序的部分中选择最小(或最大)的元素,然后将其放置在已排序部分的末尾。重复这个过程直到所有元素都排好序。常用的交换排序算法有简单选择排序堆排序,下面将着重讲解一下这两种排序的相关实现:

简单选择排序:基本思路是每次从未排序的部分中选择最小(或最大)的元素,然后将其与未排序部分的第一个元素交换位置,即将最小元素放置在已排序部分的末尾。重复这个过程直到所有元素都排好序。

该算法的性能分析如下:

回顾重点,其主要内容整理成如下内容:

堆排序

堆排序是一种基于堆数据结构的排序算法,它利用了堆的特性来进行排序。堆是一种完全二叉树,分为最大堆和最小堆两种类型。

关于堆排序的讲解可以参考我之前的文章:解锁数据结构中树与二叉树的奥秘(二) 中的堆排序讲解,总结知识如下:

归并排序

归并排序是一种常用的排序算法,它基于分治的思想。归并排序将待排序的数组不断分割为较小的子数组,然后逐步将这些子数组合并成为有序的大数组,最终得到完全有序的数组。如下:

手算模拟归并排序的过程如下:

回顾重点,其主要内容整理成如下内容: 

基数排序

基数排序是一种非比较型整数排序算法,它是通过将待排序的整数按照位数划分成不同的数字组,然后对每个数字组进行排序,最终得到有序的整数数组。

得到的结果再以十位进行分配:

最终呈现的结果如下:

回顾重点,其主要内容整理成如下内容: 

相关文章:

数据结构--》掌握数据结构中的排序算法

当我们面对海量数据时&#xff0c;如何高效地将其排序是数据结构领域中一个重要的问题。排序算法作为其中的关键部分&#xff0c;扮演着至关重要的角色。 无论你是初学者还是进阶者&#xff0c;本文将为你提供简单易懂、实用可行的知识点&#xff0c;帮助你更好地掌握排序算法在…...

Kubernetes实战(三)-k8s节点设置cpu高于多少就不调度

1 k8s节点设置的概念和原理 k8s是Google开源的容器集群管理系统&#xff0c;用于自动化部署、扩展和管理容器化应用程序。在k8s中&#xff0c;Node是指容器运行的物理或虚拟机器。Node可以是一个物理机或一个虚拟机器&#xff0c;k8s通过其调度器将Pod调度到每个Node上。对于一…...

数学建模——平稳时间序列分析方法

目录 1、平稳性的Daniel检验 &#xff08;1&#xff09;Spearman相关系数假设检验 &#xff08;2&#xff09;时间序列平稳性的Danniel假设检验 案例 【模型分析】 1、原始数据at的平稳性检验 2、一阶差分序列的平稳性检验 3、二阶差分序列的平稳性检验 4、建立AR&#…...

Vuex使用方式及异步问题处理

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《Spring与Mybatis集成整合》《Vue.js使用》 ⛺️ 生活的理想&#xff0c;为了不断更新自己 ! 目录 1.Vuex简介&#xff1a; 2.vuex获取值 2.1安装 2.2.菜单栏 2.3.模块 2.4使用 3.改…...

【Vue面试题二十七】、你了解axios的原理吗?有看过它的源码吗?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;说下你的vue项目的目录结…...

LocalDateTime与时间戳

众所周知&#xff0c;如果想把 LocalDateTime 转为时间戳&#xff0c;需要先指定时区&#xff0c;然后才能转为时间戳&#xff0c;例如&#xff1a; LocalDateTime localDateTime LocalDateTime.now(); ZonedDateTime zonedDateTime localDateTime.atZone(ZoneId.systemDe…...

【Power BI】Power BI 入门指南:版本、下载和报表创建的步骤

文章目录 一、前言二、了解 Power BI 版本三、下载 Power BI Desktop四、如何开始使用 Power BI Desktop五、在 Power BI Desktop 中创建报表六、文末总结 一、前言 Power BI 是微软于 2013 年推出的产品&#xff0c;为一款商业智能与数据可视化工具。它通过引人注目的视觉效果…...

代码随想录算法训练营第23期day21| 235. 二叉搜索树的最近公共祖先 、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

目录 一、&#xff08;leetcode 235&#xff09;二叉搜索树的最近公共祖先 二、&#xff08;leetcode 701&#xff09;二叉搜索树中的插入操作 三、&#xff08;leetcode 450&#xff09;删除二叉搜索树中的节点 一、&#xff08;leetcode 235&#xff09;二叉搜索树的最近公…...

小程序页面路由传参的方法?

小程序页面路由传参的方法有三种&#xff1a; 1.URL参数传递&#xff1a;通过在页面跳转的URL中携带参数实现传参。可以使用wx.navigateTo或wx.redirectTo等跳转方法&#xff0c;并在URL中添加参数。 示例&#xff1a; // PageA.wxml <button bindtap"navigateToPage…...

Ubuntu下安装Python

Ubuntu下安装Python 预备知识一、Python安装Python 二、Anaconda安装Anaconda卸载Anaconda 三、Miniconda安装Miniconda 四、异同比较 预备知识 (1) Python是一种编程语言。 (2) Anaconda是一款包管理工具&#xff0c;用来管理Python及其他语言的安装包&#xff0c;预装了很多…...

宝塔使用腾讯COS存储实现自动备份服务器网站数据图文教程

一、进入宝塔安装腾讯COS 点击设置打开后需要配置以下cos参数 二、腾讯云创建COS存储桶 选择私有读写&#xff0c;其他默认就行 三、创建访问密钥 四、配置宝塔中腾讯COS相关设置 很多人是配置错误导致无法正常链接cos region为cos存储桶所属地域 Bucker为存储桶名称 五、…...

npm命令介绍

npm 描述&#xff1a;Node Package Manager (NPM) 是 Node.js 的包管理器&#xff0c;用于安装、管理和发布 JavaScript 包。示例&#xff1a;npm -v npm access 描述&#xff1a;控制包的访问权限。需要管理员或拥有特定权限的用户才能执行。示例&#xff1a;npm access pu…...

openGauss学习笔记-100 openGauss 数据库管理-管理数据库安全-客户端接入之用SSL进行安全的TCP/IP连接

文章目录 openGauss学习笔记-100 openGauss 数据库管理-管理数据库安全-客户端接入之用SSL进行安全的TCP/IP连接100.1 背景信息100.2 前提条件100.3 注意事项100.4 操作步骤100.5 相关参考 openGauss学习笔记-100 openGauss 数据库管理-管理数据库安全-客户端接入之用SSL进行安…...

ESP8266 Node Mcu开发板连接WIFI并上报数据到MQTT服务器——物联网应用开发

一、前言 本文主要介绍关于ESP8266 Node Mcu开发板如何连接WIFI并将本地采集的数据上传到MQTT服务器中。 大家调试可以使用MQTTBox 二、WIFI连接 首先&#xff0c;导入WIFI连接所需的头文件&#xff0c;引入所需库。 #include <ESP8266WiFi.h> 声明字符串常量&#xff0…...

苍穹外卖(八) 使用WebSocket协议完成来单提醒及客户催单功能

WebSocket介绍 WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信(双向传输)——浏览器和服务器只需要完成一次握手&#xff0c;两者之间就可以创建持久性的连接&#xff0c; 并进行双向数据传输。 HTTP协议和WebSocket协议对比&#xff1a; HTTP…...

网站如何应对网络流量攻击

网络安全问题中&#xff0c;受到流量攻击是一种常见挑战。以下是一系列的专业建议&#xff0c;帮助您预防和减轻这类攻击&#xff0c;从而确保您的网站和数据的安全。 使用 Web 应用程序防火墙 (WAF) Web 应用程序防火墙是一项专门的安全工具&#xff0c;能够检测和拦截恶意流…...

设置Json序列化时字段的顺序

1. 背景 在部分使用场景&#xff08;如元数据驱动&#xff0c;后台接口仅返回序列化后的json字符串&#xff0c;前端需要根据每个字段在前端呈现&#xff09;&#xff0c;需要手动设置字段的长度。通常情况下&#xff0c;框架是有默认的顺序&#xff0c;如 jackson 默认使用字…...

AcWing5277. 三元组

给定一个长度为 n 的正整数数组 a1,a2,…,an 请你计算&#xff0c;一共有多少个三元组 (i,j,k)&#xff08;1≤i<j<k≤n&#xff09;&#xff0c;使得 ai⋅aj⋅ak 为最小可能值。 输入格式 第一行包含整数 n。 第二行包含 n 个正整数 a1,a2,…,an。 输出格式 一个整…...

【LeetCode热题100】--121.买卖股票的最佳时机

121.买卖股票的最佳时机 class Solution {public int maxProfit(int[] prices) {int minprice Integer.MAX_VALUE;int maxprofit 0;for(int i 0;i<prices.length;i){if(prices[i] < minprice){minprice prices[i]; //找到最小值}else if(prices[i] - minprice > ma…...

高精度计算

1.高精度加法&#xff1a; 两个非常大的数相加. 代码如下&#xff1a; #include <iostream> #include <cstring> #include <algorithm> #include <vector>using namespace std;vector<int> add(vector<int>&A,vector<int>&am…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

elementUI点击浏览table所选行数据查看文档

项目场景&#xff1a; table按照要求特定的数据变成按钮可以点击 解决方案&#xff1a; <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...