iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >如何进行C语言数据结构与算法中的排序总结
  • 502
分享到

如何进行C语言数据结构与算法中的排序总结

2023-06-22 03:06:54 502人浏览 安东尼
摘要

这篇文章将为大家详细讲解有关如何进行C语言数据结构与算法中的排序总结,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、前言学习目标:排序和查找密不可分,将待处理的数据按关键值大小有序排列后,

这篇文章将为大家详细讲解有关如何进行C语言数据结构与算法中的排序总结,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

    一、前言

    学习目标:

    排序和查找密不可分,将待处理的数据按关键值大小有序排列后,查找更加快速准确

    理解各种排序算法的定义和特点,并能将代码灵活运用

    掌握各种排序方法时间复杂度与空间复杂度

    理解排序稳定和不稳定的概念                

    重点和难点: 希尔、快速、堆、归并排序这几种快速排序

    二、基本概念

    1.排序

    定义:将一个无序的数据元素任意序列,重新排列成有序的过程

    代码:

    typedef struct{         int key;   //假设关键字为int型       OtherType  other_data;} RecordType;

    2.排序方法的稳定性

    0123456789
    541011228107612

    解读:如上个表格这样的一个无序数组,想要将它按照从小到大排序。上图下标2和6对应的数字都是10,排序后假如红色的10任然在黑色的10前面,那这种排序方法就是稳定的,否则排序方法不稳定。

    3.内部和外部排序

    • 内部排序:整个排序过程在内存中

    • 外部排序:需要排序的数过大,需要借助外部设备

    三、插入类排序

    插入类:在一个有序序列插入一个新的记录,使之仍然有序

    1.直接插入排序

    动态演示:

    如何进行C语言数据结构与算法中的排序总结

    算法讲解: 

    1. 上面的动态图可以很好的表达直接插入的过程,只是动态图有点长

    2. 首先将0作为监视哨,用一个指针从前往后找后面的数字比前面数字小的,找到了放到0

    3. 指针开始向前移动,如果指向的值比监视哨里的值大,数字向后移

    4. 如果指向的值比监视哨里的值小,那把监视哨里的值存入这个元素之后

    5. 以此类推

    代码:

    void InsSort(RecordType  r[],  int length){ int i,j;for (i=2;  i<=length;  i++) {r[0]=r[i];      j=i-1;         while (r[0].key< r[j].key )     {r[j+1]= r[j]; j=j-1;}r[j+1]=r[0];}} 

    特点: 

    稳定排序

    时间复杂度O(n*n), 空间复杂度O(1)

    2.折半插入排序

    如何进行C语言数据结构与算法中的排序总结

    算法讲解:

    1. 动态图没找到,只能用上面这张图片了

    2. 折半插入和折半查找思想差不多,对于一个有序的数组,将一个数字插入之后任然有序

    3. k=要插入的值  low=1, high=length , mid=(low+high)+1   mid对应的值比k大, high=low-1,否则 low=mid+1,

    4. 当low >high ,low后面就是k插入的位置

    代码:

    void BinSort (RecordType  r[],  int length){int i,j;    RecordType x;    int low,high,mid;for (i=2; i<=length ; ++i ) {x= r[i];  low=1;  high=i-1;while (low<=high )                   {mid=(low+high) / 2;if ( x.key< r[mid].key) high=mid-1;else low=mid+1;}for ( j=i-1 ; j>= low; --j )   r[j+1]= r[j];     r[low]=x;    }}

    特点: 

    稳定排序

    时间复杂度O(n*n), 空间复杂度O(1)

    3.希尔排序

    动态演示:

    如何进行C语言数据结构与算法中的排序总结

    算法讲解: 

    1. 对于希尔排序来说取增量 d (d一般为奇数,并且逐次递减)

    2. 上图第一次排序d等于5,将第一个作为起始点,下标+5取下一个值,一直到最后,将去到的值从小到达排序,然后将第二个作为起始点,3 4 5依次作为起始点排序

    3. 第二次是d等于3

    4. 第三次是d等于1

    代码:

    void  shellInsert(RecordType r[], int length,  int  delta){int i,j;for(i=1+delta;i<= length; i++)     if(r[i].key < r[i-delta].key){r[0]= r[i];          for(j=i-delta; j>0 &&r[0].key < r[j].key; j-=delta)r[j+delta]= r[j];r[j+delta]= r[0];}}

    特点:

    不稳定排序方法

    增量序列的d取值无除1之外的公因子,最后一个增量值必须为1

    时间复杂度O(nlogn)  空间复杂度O(1)

    四、交换类排序

    1.冒泡排序

    动态演示:

    如何进行C语言数据结构与算法中的排序总结

    算法讲解: 

    1. 设立两个指针,i,j

    2. 每一次排序都会把最大的一个数放到后面,依次类推,假设执行2次以后,那么最后2个数就不需要比较了

    3. 执行n-1次排序,结果完成

    代码:

    void  BubbleSort(RecordType r[], int length ){int n,i,j; nt change; RecordType x; n=length;  change=TRUE;for ( i=1 ; i<= n-1 && change ;++i ) {change=FALSE;for ( j=1 ; j<= n-i ; ++j) if (r[j].key > r[j+1].key )  {x= r[j];r[j]= r[j+1];r[j+1]= x;change=TRUE;} }} {int pos;if(low<high){pos=QKPass(r, low, high);  QKSort(r, low, pos-1);     QKSort(r, pos+1, high); }}

    递归算法:

    int QKPass(RecordType r[],int left,int right){ RecordType x;int low,high;x= r[left];              low=left;  high=right;while ( low<high ){while (low< high && r[high].key>=x.key )   high--;if ( low <high ) {r[low]= r[high];  low++;}  while (low<high && r[low].key<x.key  )   low++; if (  low<high  ){ r[high]= r[low]; high--; } }r[low]=x;                     return low;                     } 

    特点:

    不稳定排序,但内部排序中公认效率最好的一种

    时间复杂度O(nlogn)  空间复杂度O(logn)

    五、总结比较

    如何进行C语言数据结构与算法中的排序总结

    关于如何进行C语言数据结构与算法中的排序总结就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

    --结束END--

    本文标题: 如何进行C语言数据结构与算法中的排序总结

    本文链接: https://www.lsjlt.com/news/302139.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • 如何进行C语言数据结构与算法中的排序总结
      这篇文章将为大家详细讲解有关如何进行C语言数据结构与算法中的排序总结,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、前言学习目标:排序和查找密不可分,将待处理的数据按关键值大小有序排列后,...
      99+
      2023-06-22
    • C语言数据结构与算法之排序总结(一)
      目录一、前言二、基本概念1.排序2.排序方法的稳定性3.内部和外部排序三、插入类排序1.直接插入排序2.折半插入排序3.希尔排序四、交换类排序1.冒泡排序2.快速排序五、总结比较一、...
      99+
      2024-04-02
    • C语言数据结构与算法之排序总结(二)
      目录一、前言二、选择类排序1.简单选择排序2.树形选择排序3.堆选择排序三、归并排序四、分配类排序1.多关键字排序2.链式基数排序五、总结归纳一、前言 之前的排序总结(一)对插入类和...
      99+
      2024-04-02
    • C语言数据结构中堆排序的分析总结
      目录一、本章重点 二、堆2.1堆的介绍(三点)2.2向上调整2.3向下调整2.4建堆(两种方式)三、堆排序一、本章重点  堆向上调整向下调整堆排序 二、堆 2.1...
      99+
      2024-04-02
    • C语言数据结构与算法排序的方法有哪些
      这篇文章主要介绍“C语言数据结构与算法排序的方法有哪些”,在日常操作中,相信很多人在C语言数据结构与算法排序的方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言数据结构与算法排序的方法有哪些”的疑...
      99+
      2023-06-22
    • C语言数据结构之堆排序的优化算法
      目录1.堆排序优化算法1.1建堆的时间复杂度1.1.1 向下调整建堆:O(N)1.1.2 向上调整建堆:O(N*logN)1.2堆排序的复杂度1.2.1原堆排序的时间复杂度...
      99+
      2024-04-02
    • C语言数据结构与算法中枚举、模拟及排序的方法
      本篇内容主要讲解“C语言数据结构与算法中枚举、模拟及排序的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言数据结构与算法中枚举、模拟及排序的方法”吧!枚举连号区间数来源:第四届蓝桥杯省赛...
      99+
      2023-06-30
    • C语言中的结构体快排算法
      目录C语言结构体快排算法基于结构体数组的快速排序C语言结构体快排算法 代码: #include<stdio.h> #include<string.h> #i...
      99+
      2022-11-16
      C语言结构体 结构体快排算法 C结构体快排算法
    • C语言详解数据结构与算法中枚举和模拟及排序
      目录枚举连号区间数递增三元组二分双指针前缀和模拟特别数的和错误票据排序快速排序归并排序枚举 连号区间数 来源:第四届蓝桥杯省赛C++B组,第四届蓝桥杯省赛JAVAB组 小明这些天一直...
      99+
      2024-04-02
    • 【数据结构与算法】堆与堆排序
      目录 一.堆的实现1.堆的概念2.堆的代码实现二.堆排序的讲解 一.堆的实现 1.堆的概念 堆是一种数据结构,首先它总是一颗完全二叉树(因为堆适合表示完全二叉树),在逻辑上堆是一颗...
      99+
      2023-09-04
      php 开发语言 原力计划
    • C语言植物大战数据结构希尔排序算法
      目录前言一、插入排序1.排序思路2.单趟排序详细图解3.整体代码4.时间复杂度(1).最坏情况下(2).最好情况下(3).基本有序情况下(重点)5.算法特点二、希尔排序1.希尔从哪个...
      99+
      2024-04-02
    • C语言数据结构经典10大排序算法刨析
      1、冒泡排序 // 冒泡排序 #include <stdlib.h> #include <stdio.h> // 采用两层循环实现的方法。 // 参数a...
      99+
      2024-04-02
    • 数据结构与算法之手撕排序算法
      目录前言为什么要学习排序算法?一.排序的概念及其应用1.1排序的概念1.2排序运用1.3 常见的排序算法二.排序算法分类1.插入排序1.1基本思想:1.2直接插入排序:1.3 希尔排...
      99+
      2023-05-16
      Java数据结构与算法 Java排序算法 数据结构与算法 排序算法
    • java数据结构与算法(快速排序法)
      快速排序法: 顾名思议,快速排序法是实践中的一种快速的排序算法,在c++或对java基本类型的排序中特别有用。它的平均运行时间是0(N log N)。该算法之所以特别快,主要是由于非...
      99+
      2024-04-02
    • C语言数据结构之堆排序详解
      目录1.堆的概念及结构2.堆的实现2.1 堆的向下调整算法2.2 堆的向上调整算法2.3 建堆(数组)2.4 堆排序2.5 堆排序的时间复杂度1.堆的概念及结构 如果有一个关键码的集...
      99+
      2024-04-02
    • C语言数据结构与算法之单链表
      目录基本概念读取数据元素获取第i个结点的数据元素插入数据元素 初始化链表打印链表顺序表查空顺序表的删除 删除第i个结点及其数据元素情况1:当删除的是第一个元素情况2:除第一个结点外完...
      99+
      2024-04-02
    • C语言数据结构与算法之链表(二)
      目录引入模拟链表介绍插入代码实现代码实现  引入 在上一节的学习中我们介绍了C语言如何实现链表,但是,在这一章,我们将抛开令人头秃的指针和结构体,我们将另外使用一种数组来实现的方式,...
      99+
      2024-04-02
    • C语言数据结构与算法之链表(一)
      目录引言链表的相关思考链表结点结构建立链表实现插入操作完整代码引言 在存储一大波数的时候,我们通常使用的是数组,但是数组有时候又会显得不够灵活,比如下面这个例子: 有一串已经排序好的...
      99+
      2024-04-02
    • C语言数据结构经典10大排序算法实例分析
      今天小编给大家分享一下C语言数据结构经典10大排序算法实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、冒泡排序//...
      99+
      2023-06-29
    • 如何进行数据结构C语言链表的实现
      这篇文章将为大家详细讲解有关如何进行数据结构C语言链表的实现,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。前言需要用到的函数库#include<stdio.h>#include&...
      99+
      2023-06-22
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作