首页 > 其他分享 >数据结构--排序--C语言

数据结构--排序--C语言

时间:2024-08-24 15:51:29浏览次数:13  
标签:排序 -- 复杂度 元素 C语言 序列 array 数据结构 插入排序

文章目录

数据结构—排序

一、排序的概念及其运用

1、排序的概念

  1. 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。
  2. 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。
  3. 内部排序:数据元素全部放在内存中的排序。
  4. 外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不断地在内外存之间移动数据的排序。

2、排序运用

排序的应用在生活中很常见。
在这里插入图片描述

二、常见的排序算法

在这里插入图片描述

1、插入排序

基本思想:直接插入排序是一种简单的插入排序法,待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为
止,得到一个新的有序序列 。

直接插入排序:

当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移

特性总结:

  1. 元素集合越接近有序,直接插入排序算法的时间效率越高
  2. 时间复杂度:O(N^2)
  3. 空间复杂度:O(1),它是一种稳定的排序算法
  4. 稳定性:稳定
希尔排序( 缩小增量排序 )

希尔排序法 又称 缩小增量法。
基本思想:先选定一个整数,把待排序文件中所有记录分成个组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述分组和排序的工作。当到达=1时,所有记录在统一组内排好序。

特性总结:

  1. 希尔排序是对直接插入排序的优化。
  2. 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。
  3. 希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,因此在好些树中给出的希尔排序的时间复杂度都不固定。
  4. 稳定性:不稳定。

2、选择排序

基本思想:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 。

直接选择排序:

在元素集合array[i]–array[n-1]中选择关键码最大(小)的数据元素若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个)元素交换,在剩余的array[i]–array[n-2](array[i+1]–array[n-1])集合中,重复上述步骤,直到集合剩余1个元素。

特性总结:

  1. 直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用
  2. 时间复杂度:O(N^2)
  3. 空间复杂度:O(1)
  4. 稳定性:不稳定
堆排序

堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆来进行选择数据。需要注意的是排升序要建大堆,排降序建小堆。

特性总结:

  1. 堆排序使用堆来选数,效率就高了很多。
  2. 时间复杂度:O(N*logN)
  3. 空间复杂度:O(1)
  4. 稳定性:不稳定

3、交换排序

基本思想:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置。特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。

冒泡排序

循环进行两两比较,交换。实现排序。
特性总结:

  1. 冒泡排序是一种非常容易理解的排序
  2. 时间复杂度:O(N^2)
  3. 空间复杂度:O(1)
  4. 稳定性:稳定
快速排序

快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法。
基本思想:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。

快速排序递归实现的主框架,与二叉树前序遍历规则非常像,在写递归框架时可以想想二叉树前序遍历规则即可快速写出来,后序只需分析如何按照基准值来对区间中数据进行划分的方式即可。

将区间按照基准值划分为左右两半部分的常见方式有:
  1. hoare版本
  2. 挖坑法
  3. 前后指针版本
快速排序优化
  1. 三数取中法选key
  2. 递归到小的子区间时,可以考虑使用插入排序
    特性总结:
  3. 快速排序整体的综合性能和使用场景都是比较好的,所以才敢叫快速排序
  4. 时间复杂度:O(N*logN)
  5. 空间复杂度:O(logN)
  6. 稳定性:不稳定

4、归并排序

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide andConquer)的一个非常典型的应用。
基本思想:将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

特性总结:

  1. 归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题。
  2. 时间复杂度:O(N*logN)
  3. 空间复杂度:O(N)
  4. 稳定性:稳定:

5、非比较排序

计数排序

计数排序 又称 鸽巢原理,是对哈希直接定址法的变形应用。
操作步骤:

  1. 统计相同元素出现次数
  2. 根据统计的结果将序列回收到原来的序列中

特性总结:
4. 计数排序在数据范围集中时,效率很高,但是适用范围及场景有限。
5. 时间复杂度:O(MAX(N,范围))
6. 空间复杂度:O(范围)
7. 稳定性:稳定

排序算法的实现请关注后续博客。

三、排序算法复杂度及稳定性

请添加图片描述

标签:排序,--,复杂度,元素,C语言,序列,array,数据结构,插入排序
From: https://blog.csdn.net/2301_79642159/article/details/141499213

相关文章

  • MySQL学习笔记之用户管理与权限控制(DCL)
    文章目录MySQL用户管理与权限控制用户管理(DCL-DataControlLanguage)1.查询用户2.创建用户3.修改用户密码4.删除用户权限控制(DCL-DataControlLanguage)1.查询权限2.授予权限3.撤销权限总结完整代码<br/>MySQL用户管理与权限控制用户管理(DCL-Dat......
  • TMDOG的微服务之路_07——初入微服务,NestJS微服务快速入门
    TMDOG的微服务之路_07——初入微服务,NestJS微服务快速入门博客地址:TMDOG的博客在前几篇博客中,我们探讨了如何在NestJS中的一些基础功能,并可以使用NestJS实现一个简单的单体架构后端应用。本篇博客,我们将进入微服务架构,以一个简单的NestJS示例快速了解微服务架构。1.什......
  • TMDOG的微服务之路_08——使用Docker部署NestJS微服务
    TMDOG的微服务之路_08——使用Docker部署NestJS微服务博客地址:TMDOG的博客在上一篇博客中,我们探讨了如何使用NestJS创建一个简单的微服务架构。为了将这些微服务部署到生产环境,我们可以使用Docker来打包和管理这些服务。本篇博客将详细介绍如何使用Docker和Docker......
  • trie 树详解 + 例题
    看这篇做的笔记la~ほら、もうすぐ晴れますよ!字典树字典树(trie树)是一种用于实现字符串快速检索的多叉树结构。trie树的每个节点都拥有若干个字符指针,若在插入或检索字符串时扫描到一个字符c,就沿着当前节点的c字符指针,走向该指针指向的节点。下图即为一个简易版字典树,存......
  • pg数据库备份脚本
    一、前提①linux服务器;②本地安装有pg数据库,并有pg_dump命令二、准备备份脚本备份脚本/pie/data/backup_script26.sh内容如下:=============================#!/bin/bash#设置数据库连接变量DB_HOST="172.30.3.26"#数据库主机地址DB_PORT="5432"#数据库端口,PostgreSQL......
  • 从零开始学习C++之结构体
    前言之前讲过变量,讲了数据类型(如int等),而结构体就相当于创造一个类型。定义结构体首先,写上一个神圣不可侵犯的(bushi)struct。好了,不开玩笑了。在程序外围定义(一般写在命名空间后面)。struct名字{ 含有的东西。};一定一定要有分号!!!例:定义存储坐标的结构体structzuo......
  • [LeetCode]999. 可以被一步捕获的棋子数
    可以被一步捕获的棋子数简单给定一个8x8的棋盘,只有一个白色的车,用字符'R'表示。棋盘上还可能存在白色的象'B'以及黑色的卒'p'。空方块用字符'.'表示。车可以按水平或竖直方向(上,下,左,右)移动任意个方格直到它遇到另一个棋子或棋盘的边界。如果它能够在一次移动中移......
  • 056、Vue3+TypeScript基础,页面通讯之$attrs父类子类孙类互传数据和事件
    01、main.js代码如下://引入createApp用于创建Vue实例import{createApp}from'vue'//引入App.vue根组件importAppfrom'./App.vue'//引入emitter用于全局事件总线//importemitterfrom'@/utils/emitter'constapp=createApp(App);//App.vue的根元素id为......
  • 3D 高斯第二个版本安装
     基本和第一个一样的流程cuda环境安装教程https://www.cnblogs.com/gooutlook/p/17677113.html  工程环境安装指令#官网https://github.com/graphdeco-inria/reduced-3dgs#=============1从文件创建环境============容易在submodules安装时候报错卡死condae......
  • PG数据库导致断电/重启无法正常启动问题排查
    PG数据库导致断电/重启无法正常启动问题排查一、问题数据库断电后,启动PG数据库后无法正常启动,报”psql:couldnotconnecttoserver:Nosuchfileordirectory”的错误,错误图片如下:  二、背景分析数据库是单机版,使用k8s进行部署运行在指定节点,数据目录挂服务器的指定......