哦,这是桶排序

漫画:什么是桶排序?

要了解桶排序之前,可以先看看上面小灰的那篇文章,我觉得是比较不错的。

桶排序也可以理解为分类排序,把不同的数据归类,归类之后再重新排序,每个桶里面的内容就是一类数据,然后对每个桶里面的数据进行排序。

至于需要多少个桶,我们可以根据每个桶能装的数据数量来反推计算。

比如我们有一千个数据 1000。

我们每个桶的数据区间是 200。

那我们就需要 1000/200 = 5个桶来装这些数据。

    0 ~200

200 ~400

400 ~600

600 ~800

800 ~1000

我们看维基百科官方的图片解析

排序之前

排序之后

上代码

#include "stdio.h"
#include "string.h"#define BUCKET_NUM  5   /*桶排序中桶的个数*/
#define BUCKET_STEP 200 /*假设需要排序的最大数值是 1000/5,10个桶,每个桶的范围是 1000/10 =  100*/int bucket_sort(int *arr,int n)
{int i,j,k,m;int buck[BUCKET_NUM][n];memset(buck,0,sizeof(buck));/*数据放到对应的桶里面*/for(i=0;i<n;i++){if(arr[i]<=BUCKET_STEP){  for(j=0;j<n;j++){if(buck[0][j] == 0){buck[0][j] = arr[i];break;}}}else if(arr[i] > BUCKET_STEP && arr[i]   <= 2*BUCKET_STEP){for(j=0;j<n;j++){if(buck[1][j] == 0){buck[1][j] = arr[i];break;}}}else if(arr[i] > 2*BUCKET_STEP && arr[i] <= 3*BUCKET_STEP){for(j=0;j<n;j++){if(buck[2][j] == 0){buck[2][j] = arr[i];break;}}}else if(arr[i] > 3*BUCKET_STEP && arr[i] <= 4*BUCKET_STEP){for(j=0;j<n;j++){if(buck[3][j] == 0){buck[3][j] = arr[i];break;}}}else if(arr[i] > 4*BUCKET_STEP && arr[i] <= 5*BUCKET_STEP){for(j=0;j<n;j++){if(buck[4][j] == 0){buck[4][j] = arr[i];break;}}}else{printf("error arr[%d]=%d \n",i,arr[i]);}}/*调试打印*/for(i=0;i<BUCKET_NUM;i++)for(j=0;j<n;j++)if(buck[i][j]!= 0) printf("%d ",buck[i][j]);printf("\n");/*对桶里面的数据进行排序*/for(i=0;i<BUCKET_NUM;i++){for(j=0;j<n;j++){for(k=0;k<n-1-j;k++){ if( buck[i][k] > buck[i][k+1]) {/*交换*/buck[i][k] ^= buck[i][k+1];buck[i][k+1] ^= buck[i][k];buck[i][k] ^= buck[i][k+1];}}}}/*打印*/for(i=0;i<BUCKET_NUM;i++)for(j=0;j<n;j++)if(buck[i][j]!= 0) printf("%d ",buck[i][j]);printf("\n");    
}int main()
{int i;int arr[20] = {12,12,1,78,500,5,7,699,752,233,1,13,399,599,500,462,801,699,19,345};for(i=0;i<sizeof(arr)/sizeof(arr[0]);i++)printf("%d ",arr[i]);printf("\n");bucket_sort(arr,sizeof(arr)/sizeof(arr[0]));return 0;
}

这个代码的思路我大概说一下,桶的数量和区间我先确定好了,然后呢,我把数据放到对应的桶里面去。

再然后呢,我使用冒泡排序把每个小桶里面的数据排序了一次。

原理上很简单。

如果我们把桶的数量确定为1,然后一个桶把所有的数据都存下来,这就是计数排序了,除了冒泡排序之外,我觉得计数排序是一种很容易记住的排序算法。桶排序其实有点啰嗦,原理不错,但是如果处理一些小数据的话,作用很小。

程序输出

weiqifa@bsp-ubuntu1804:~/c$ gcc tongpaixu.c && ./a.out
12 12 1 78 500 5 7 699 752 233 1 13 399 599 500 462 801 699 19 345
12 12 1 78 5 7 1 13 19 233 399 345 500 599 500 462 699 752 699 801
1 1 5 7 12 12 13 19 78 233 345 399 462 500 500 599 699 699 752 801
weiqifa@bsp-ubuntu1804:~/c$

推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

我的知识小密圈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466749.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LinuxC高级编程——进程

LinuxC高级编程——进程 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 每个进程在内核中都有一个进程控制块&#xff08; PCB&#xff09;来维护进程相关的信息&#xff0c; Linux内核的 进程控制块是task_struct结构体。PCB包含的信息&#xff1a; …

Oracle常见用法总结

近来&#xff0c;操作数据库比较多&#xff0c;总结了一下常用的语句&#xff01;&#xff01;&#xff01; &#xff08;1&#xff09;Oracle的默认用户 用户名&#xff1a;scott 密码&#xff1a; tiger 权限&#xff1a;普通用户 用户名&#xff1a…

如何防御光缆窃听

很多年前&#xff0c;人们就认识到采用铜缆传输信息很容易通过私搭电缆的方式被窃取。对于一个网络和安全管理人员来说&#xff0c;要么对铜缆采用更严格的安全防护措施&#xff0c;要么就使用光缆。因为很多人都认为光纤可以很好地防止***通过窃听手段截获网络数据。但是实际上…

Linux字符设备驱动实例

globalmem看 linux 设备驱动开发详解时&#xff0c;字符设备驱动一章&#xff0c;写的测试代码和应用程序&#xff0c;加上自己的操作&#xff0c;对初学者我觉得非常有帮助。写这篇文章的原因是因为我看了我之前发表的文章&#xff0c;还没有写过字符设备相关的&#xff0c;至…

8-[函数]-嵌套函数,匿名函数,高阶函数

1.嵌套函数 &#xff08;1&#xff09;多层函数套用 name "Alex"def change_name():name "Alex2"def change_name2():name "Alex3"print("第3层打印", name)change_name2() # 调用内层函数print("第2层打印", name)chan…

Linux C高级编程——时间编程

Linux高级编程——时间编程 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 1 时间类型 &#xff08;1&#xff09; 世界标准世界&#xff08;格林威治时间&#xff09; &#xff08;2&#xff09; 日历时间&#xff08;1970年1月1日0时&#xff09;—…

Excel——多个Sheet页合并成一个

import xlrd import pandas as pd from pandas import DataFrame from openpyxl import load_workbookexcel_name 文件路径/文件名.xlsx #表格地址表格名 wb xlrd.open_workbook(excel_name) # 获取workbook中所有的表格 sheets wb.sheet_names() # print(sheets)# 循环遍…

c语言画谢宾斯基三角形

谢宾斯基三角形是一个有意思的图形&#xff0c;&#xff08;英语&#xff1a;Sierpinski triangle&#xff09;是一种分形&#xff0c;由波兰数学家谢尔宾斯基在1915年提出,它是一种典型的自相似集。先画一个三角形&#xff0c;然后呢&#xff0c;取三角形的中点&#xff0c;组…

F-Secure Client Security 注册机

F-Secure Client Security 6.*/7.* 通用注册机&#xff1a;下载地址&#xff1a;http://files.cnblogs.com/boringlamb/Keymaker.rar听说8的beta版已经出来&#xff0c;期待正式版&Keygen :)转载于:https://www.cnblogs.com/boringlamb/archive/2008/04/07/1140540.html

进程间的通信——无名管道

进程间的通信——无名管道 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、进程间的通信 &#xff08;1&#xff09;同主机进程间数据交互机制&#xff1a;无名管道&#xff08;PIPE&#xff09;&#xff0c;有名管道&#xff08;FIFO&#xff09;…

sklearn官网-多分类问题

sklearn实战-乳腺癌细胞数据挖掘&#xff08;博主亲自录制视频&#xff09; https://study.163.com/course/introduction.htm?courseId1005269003&utm_campaigncommission&utm_sourcecp-400000000398149&utm_mediumshare 1.12.6. Multioutput classification Mult…

剖析C语言是如何画出这样的三角形的

哈哈&#xff0c;就是喜欢这些有意思的C语言上篇文章是这样写的c语言画谢宾斯基三角形那篇文章写的有点不直接&#xff0c;然后再查了下资料&#xff0c;看到了下面这些&#xff0c;我觉得解释更加好&#xff0c;这里主要是运用了光栅法&#xff0c;至于光栅法&#xff0c;可以…

NILMTK在Windows下的安装教程

近期&#xff0c;要进行负荷辨识&#xff0c;找到NILMTK安装包&#xff0c;特意将过程记录下来。 &#xff08;1&#xff09;Windows安装 本机已安装了Anaconda&#xff0c;环境是Python3&#xff0c;NILMTK包的项目地址为&#xff1a;https://github.com/nilmtk/nilm_metada…

who|sort实现

who|sort实现 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 创建无名管道&#xff0c;执行who命令的进程将输出重定向到管道的写端&#xff1b;执行sort命令的进程将输入重定向到管道的读端。即who的输出连接到sort的输入。 #include <stdio.h>…

修改cmdline 把内存改成512MB

#添加cmdline的方式— — 在BoardConfig.mk中修改device/mediateksample/aiv8167sm3_bsp/BoardConfig.mk BOARD_KERNEL_CMDLINE bootopt64S3,32N2,32N2 mem512MB— — 在dts 里面修改kernel-4.4\arch\arm\boot\dts\*.dts / {model "Atmel AT91SAM9M10G45-EK";compa…

selenium webdriver模拟鼠标键盘操作

在测试使用Selenium webdriver测试WEB系统的时候&#xff0c;用到了模拟鼠标、键盘的一些输入操作。 1、鼠标的左键点击、双击、拖拽、右键点击等&#xff1b; 2、键盘的回车、回退、空格、ctrl、alt、shift等&#xff1b; 在webdriver中&#xff0c;有专门的一个类&#xff0c…

NILMTK——经典数据集REDD介绍和使用

配置了NILMTK包的环境之后&#xff0c;想找数据测试一下&#xff0c;在NILMTK官网的API Docs里边发现dataset_converters模块中有内置的数据集处理函数&#xff0c;如图&#xff1a; 将数据转换成HDF文件&#xff0c;这些数据都是比较优秀的&#xff0c;其中&#xff0c;常用的…

[转]ASP中ActiveX控件的内嵌及调用

懂ASP&#xff08;Active Server Pages&#xff09;的人很多&#xff0c;但能用ASP自如地调用ActiveX控件的人却不多&#xff1b;如果不调用ActiveX控件&#xff0c;则可以说微软当初设计ASP的初衷根本没有达到。众所周知&#xff0c;ActiveX技术是微软在Internet上除了IE外的另…

Linux C实现简单的shell

Linux C下实现简单的Shell 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 【需求描述】 用各种C函数实现一个简单的交互式Shell&#xff1a; 1、给出提示符&#xff0c;让用户输入一行命令&#xff0c;识别程序名和参数并调用适当的exec函数执行程序…

上拉电阻的作用

1、介绍使用微控制器&#xff08;MCUs&#xff09; 或任何数字逻辑设备时&#xff0c;上拉电阻器非常常见。本教程将解释何时何地使用上拉电阻器&#xff0c;然后我们将做一个简单的计算&#xff0c;以显示为什么上拉很重要。2、上拉电阻是什么&#xff1f;假设您有一个将一个引…