【数据结构】排序

2023-05-16

本文主要选取了桶排序,冒泡排序,以及快速排序。当然还有其他几种,可以根据需要进行学习。

一、桶排序

1、什么是桶排序?

桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。桶排序的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排)。

2、为了使桶排序更加高效,我们需要做到这两点:

在额外空间充足的情况下,尽量增大桶的数量;使用的映射函数能够将输入的 N 个数据均匀的分配到 K 个桶中。同时,对于桶中元素的排序,选择何种比较排序算法对于性能的影响至关重要。

3、根据上面的定义,我们来探究一下:

a.什么时候排序最慢?当输入的数据被分配到了同一个桶中。

b.什么时候排序最快?当输入的数据可以均匀的分配到每一个桶中。

4、算法描述

a.设置一个定量的数组当作空桶;

b.遍历输入数据,并且把数据一个一个放到对应的桶里去;

c.对每个不是空的桶进行排序;

d.从不是空的桶里把排好序的数据拼接起来。

5、图示桶排序

5、图示算法

在桶中的元素分布:

然后,元素在每个桶中排序:

6、代码实现(将5 3 5 2 8按照从小到大顺序输出

#include <stdio.h>
int main() 
{ 
 int a[11],i,j,t; 
 for(i=0;i<=10;i++) 
 a[i]=0; //初始化为0 
 
 for(i=1;i<=5;i++) //循环读入5个数
 {
    scanf("%d",&t); //把每一个数读到变量t中
    a[t]++; //进行计数
 } 
 for(i=0;i<=10;i++) //依次判断a[0]~a[10] 
 for(j=1;j<=a[i];j++) //出现了几次就打印几次
 printf("%d ",i); 
 getchar();getchar(); 
 //这里的getchar();用来暂停程序,以便查看程序输出的内容
 //也可以用system("pause");等来代替
 return 0; 
}

二、冒泡排序

1、什么是冒泡排序?

冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,
也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

2、算法描述

a.比较相邻的元素。如果第一个比第二个大,就交换它们两个;
b.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
c.针对所有的元素重复以上的步骤,除了最后一个;
d.重复步骤1~3,直到排序完成。

3、图示算法()

 4、代码实现(将8 100 50 22 15 6 1 1000 999 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、什么是快速排序?

快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

2、算法描述

快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下:

1.从数列中挑出一个元素,称为 “基准”(pivot);
2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
3.递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列分别进行快速排序,直至所有元素都归位。

4、图示算法

 5、代码实现(将6 1 2 7 9 3 4 5 10 8按照从小到大顺序输出

#include <stdio.h> 
int a[101],n;//定义全局变量,这两个变量需要在子函数中使用 
void quicksort(int left,int right) 
{ 
 int i,j,t,temp; 
 if(left>right) 
 return; 
 
 temp=a[left]; //temp中存的就是基准数 
 i=left; 
 j=right; 
 while(i!=j) 
 { 
   //顺序很重要,要先从右往左找 
   while(a[j]>=temp && i<j) 
   j--; 
   //再从左往右找 
   while(a[i]<=temp && i<j) 
   i++; 
   //交换两个数在数组中的位置 
   if(i<j)//当哨兵i和哨兵j没有相遇时
   { 
     t=a[i]; 
     a[i]=a[j]; 
     a[j]=t; 
   } 
 } 
 //最终将基准数归位
 a[left]=a[i]; 
 a[i]=temp; 
 
 quicksort(left,i-1);//继续处理左边的,这里是一个递归的过程 
 quicksort(i+1,right);//继续处理右边的,这里是一个递归的过程 
} 

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; 
}

四、三种排序的区别

 由上表可见,桶排序是最快的,它的时间复杂度是 O(n+k);冒泡排序是 O(n2);快速排序是 O(nlog2n)。但是桶排序是最占空间的,它的空间复杂度是O(n+k),冒泡排序是 O(1);快速排序是 O(1)。

可以根据应用选择不同的排序,快速排序在实际应用使用较多。

如果需要了解更多排序的相关知识,可以参考

十大排序——最全最详细,一文让你彻底搞懂_Three3333333的博客-CSDN博客

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【数据结构】排序 的相关文章

随机推荐

  • 【目录】Buildroot学习记录

    Buildroot 学习记录 xff08 1 xff09 简介与理论 Buildroot 学习记录 xff08 2 xff09 配置注解 Buildroot 学习记录 xff08 3 xff09 其他功能 Buildroot 学习记录 xf
  • 【目录】Yocto学习记录

    Yocto 学习记录 xff08 1 xff09 理论知识 Yocto 学习记录 xff08 2 xff09 资源资料 Yocto 学习记录 xff08 3 xff09 实际操作
  • 【Buildroot】学习记录(2)配置注释

    文章目录 一 前言二 Buildroot目录结构三 Buildroot配置选项四 Target options 目标选项 五 Build options 编译选项 六 Toolchain 工具链 七 System configuration
  • oracle alter table详解

    建测试表 create table dept deptno number 3 primary key dname varchar2 10 loc varchar2 13 create table employee info empno nu
  • 【目录】音视频开发笔记

    音视频开发 基础知识 xff1a 音频基础 音视频开发 基础知识 xff1a 视频简介 音视频开发 基础知识 xff1a 视频封装格式和编码格式 音视频开发 基础知识 xff08 1 xff09 音视频开发 基础知识 xff08 2 xff
  • 串口通信之(一)获取传感器数据(modbus rtu master)

    一天领导拿了几个传感器设备丢给我 xff0c 给我把这些数据取到 我一看 xff0c 好家伙 这是要搞硬件了啊 那就搞他丫的 可是 xff0c 怎么搞是个问题 我是一头雾水 还好 xff0c 和传感器丢给我的 xff0c 还有传感器厂家一起
  • 小觅深度版-realsense系列,深度相机对比

    本文为CSDN原创文章 xff0c 转载请注明出处 本文为CSDN原创文章 xff0c 转载请注明出处 本文对比了目前小觅生产的深度版 xff08 120 xff09 相机 Realsense D435以及 Realsense ZR300
  • VIO单目评测算法:A Benchmark Comparison of Monocular Visual-Inertial Odometry Algorithms for Flying Robots

    A Benchmark Comparison of Monocular Visual Inertial Odometry Algorithms for Flying Robots 飞行器单目VIO算法测评 算法方面总结 xff1a MSCK
  • LVM调整home剩余空间到root分区

    注意 xff1a 1 此方法为LVM逻辑卷调整 xff0c 请确认是否为逻辑卷分区 xff0c 且文件系统格式为ext4或者xfs 2 减少home分区会将home分区格式化 xff0c 请先备份home分区 xff0c 但是放心增加的ro
  • git clone 指定某个分支而不是整个版本仓库

    最近在搭建Gitblit内网仓库时发现一个问题 xff0c git clone 只能clone整个仓库 xff0c 但是如果我只需要仓库里面的某一个分支 xff0c 这时还需要clone整个仓库就很头疼 xff0c 下面用这个命令就可实现c
  • 十九、I2C驱动及应用

    一 概述 1 Linux主机驱动和外设驱动分离思想 外设驱动 API 主机驱动 板级逻辑 具体的i2c设备 xff08 camera xff0c ts xff0c eeprom等等 xff09 主机驱动 xff1a 根据控制器硬件手册 xf
  • 内核驱动的本质——模块

    内核驱动的本质 模块 在Linux中 xff0c 驱动的本质就是一个模块 模块可以被选择 静态编译 或 模块化编译 1 静态编译 xff1a 链接入内核镜像 xff0c 默认永远被加载 2 模块化编译 xff1a 需要在内核运行时动态加载
  • 【STM32知识点】关于串口接收中断(回调函数)

    串口使用流程 xff1a 1 初始化串口 2 使能中断 xff08 在非阻塞模式下接收一定量的数据 xff09 HAL UART Receive IT UART HandleTypeDef huart uint8 t pData uint1
  • 最近看书少了,以后要多看书

    最近两周的oracle学习都是围绕csdn上oracle板块中遇到的问题 xff1b 看书少了 xff0c 遇到不懂的知识 xff0c 查询书籍 xff0c 查询网络的次数多了 xff1b 于是与电脑一起度过的时间 xff0c 占了大约9
  • 【STM32Cube HAL】定时器中断(四)

    实验内容 xff1a 使用基本定时器 xff0c 实现LED灯以1S间隔进行亮灭切换 一 原理图 二 CubeMX配置 Step1 打开 STM32CubeMX xff0c 点击 New Project xff0c 选择芯片型号 xff0c
  • 【STM32Cube HAL】输入捕获(六)——PWM测量

    对于PWM的捕获 xff0c 我这里一共使用两种方法实现 xff1a 第一种是PWM输入模式 xff0c 采用一个定时器的两个通道 xff08 通道一和通道二 xff09 xff0c 配置从模式为复位模式 xff0c 没有进行溢出处理 xf
  • 【STM32知识点】关于不同外设中断标志位清除的使用笔记(更新中)

    在使用中断函数的时候 xff0c 我们往往忘记在中断服务函数内清除中断标志位而导致一些未知错误 以下我总结了几个外设关于中断标志位的清除问题 定时器 xff1a 1 在程序有使用到中断的情况下 xff0c 定时器在使能之前需要先清除更新中断
  • 【FreeRTOS 应用开发笔记】软件定时器(九)

    一 软件定时器的基本概念 1 硬件定时器和软件定时器的主要区别 定时器 xff0c 是指从指定的时刻开始 xff0c 经过一个指定时间 xff0c 然后触发一个超时事件 xff0c 用户可以自定义定时器的周期与频率 硬件定时器 xff1a
  • 【STM32知识点】STM32基础知识总结

    目录 认识STM32 GPIO外设 一 GPIO的八种工作模式 二 总结在STM32中选用IO模式 RCC时钟 NVIC是嵌套向量中断控制器 一 优先级定义 二 优先级分组 EXTI外部中断 事件控制器 SysTick系统定时器 通讯的基本
  • 【数据结构】排序

    本文主要选取了桶排序 xff0c 冒泡排序 xff0c 以及快速排序 当然还有其他几种 xff0c 可以根据需要进行学习 一 桶排序 1 什么是桶排序 xff1f 桶排序是计数排序的升级版 它利用了函数的映射关系 xff0c 高效与否的关键