计数排序,桶排序,基数排序

计数排序:

找出数据中的最大值和最小值,并创建哈希表,把 数据-最小值 作为数组的下标访问哈希表并标记数量,标记完后,遍历哈希表,当表中的值大于0,把 **下标+最小值 (下标=元素-最小值)**还原数据依次放回数组中,是一种典型的以空间换时间的算法
该排序算法理论上速度非常快,它不是基于比较的算法,在一定范围内整数排序时快于任意的一种比较排序算法,但是有很大的局限性:适合排序整形数据,而且数据的范围差别不宜过大,否则会非常浪费内存反而慢于比较的排序,如果数据越平均、重复数越多,性价比越高
时间复杂度:Ο(N+k)(其中k是整数的范围)
稳定的在这里插入图片描述

max-min+1=75,总共需要开辟的空间 //开辟足够大的空间

元素-min=元素的下标 //把数组从0开始

桶:

  根据数据的值存储到不同的桶中,然后再调用其它的排序算法,对桶中的数据进行排序,然后再从桶中依次拷贝回数组中,从而降低排序的规模以此提高排序的速度,是一种典型的以空间换时间的算法缺点:如何分桶、桶范围多大,这些都需要对数据有一定的了解时间复杂度:Ο(N+k)桶排序的稳定性取决于桶内排序使用的算法

基数:

    是桶排序的具体实现,首先创建10个队列(链式队列),然后逆序计算出数据的个、十、百...位数,然后入到对应的队列中,结束后依次从队列中出队回数组中,数据下一位继续入队,依次循环,最大值的位数就是循环次数缺点:只适合排序正整数数据,又要准备队列时间复杂度:Ο(N+k)稳定的
在这里插入代码片
```#include <stdio.h>
#include<stdbool.h>
#include<stdlib.h>
#include"queue.c"
#define swap(a,b) {typeof(a) t=(a);a=b;b=t;}
#define LEN 10
typedef void (*SortFP)(int *,int );
void show(int *,int );//计数排序
void count_sort(int *arr,int len)
{int min=arr[0];int max=arr[0];for(int i=0;i<len;i++){if(arr[i]<min) min=arr[i];if(arr[i]>max) max= arr[i];}//哈希表//开辟max-min个空间int  *hash=calloc(sizeof(int),max-min+1);//标记哈希表for(int i=0;i<len;i++){hash[arr[i]-min]++;	}//还原到arr中for(int i=0,j=0;i<=max-min;i++){while(hash[i]--){arr[j++]=i+min;}}free(hash);show(arr,len);printf("%s\n",__func__);}
//cnt 桶的数量 range桶中的数据范围void _bucket_sort(int *arr,size_t len,int cnt ,int range)
{//申请桶的内存//bucket指向桶的开头,bucketend指向末尾,数据加入bucketend++;//指针数组int *bucket[cnt],*bucketend[cnt];for(int i=0;i<cnt;i++){//数据可能全部在一个桶bucket[i]=malloc(sizeof(int)*len);//开始时,起始,末尾指针都指向开头bucketend[i]=bucket[i];}//把所有数据,按照桶的范围放入对应的桶中for(int i=0;i<len;i++){for(int j=0;j<cnt;j++){if(arr[j]>=j*range && arr[j]<range*(j+1)){*(bucketend[j])=arr[i];bucketend[j]++;    //存入之后指针向后移动}}}//让每个桶的数据排序,分别存入arr中for(int i=0;i<cnt;i++){//计算每个桶中的元素int size=bucketend[i]-bucket[i];//如果有元素才需要别的算法if(size>1){count_sort(bucket[i],len);	}memcpy(arr,bucket[i],sizeof(int)*size);arr+=size;free(bucket[i]);}}//桶排序
void bucket_sort(int *arr,size_t len)
{_bucket_sort(arr,len,4,25);show(arr,len);printf(":%s\n",__func__);}//基数排序
void radix_sort(int *arr,size_t len)
{ListNode *queue[10]={};for(int i=0;i<len;i++){queue[i]=create_list_queue();}//循环次数由最大值的位数决定int max=arr[0];for(int i=0;i<len;i++){if(arr[i]>max) max=arr[i];	}//i是1表示个位,2表示十位,3表示百位for(int i=1,k=1;max/k>0;k*=10,i++){int mod=pow(10,i);int div=mod/10;for(int j=0;j<len;j++){//获取每位的值,如果mod过大,数据的index是0	int index=arr[j]%mod/div;push_list_queue(queue[index],arr[j]);}int k=0;for(int j=0;j<10;j++){//把队列中的数据按顺序放回arrwhile(!empt_list_queue(queue[j])){arr[k++]= hea_list_queue(queue[j]);pop_list_queue(queue[j]);}}}show(arr,len);printf(":%s\n",__func__);
}int main(int argc,const char* argv[])
{int arr[LEN]={};SortFP sort[]={bubble_sort,Select_sorting,insertion_Sort2,shell_Sort2,quick_sort,sort_heap,sort_heap_r,count_sort,bucket_sort,radix_sort};for(int i=0;i<sizeof(sort)/sizeof(sort[0]);i++){for(int j=0;j<LEN;j++){arr[j]=rand()%100;printf("===");}printf("\n");show(arr,LEN);printf("排序前\n");sort[i](arr,LEN);}//bubble_sort(arr,n);   //冒泡//Select_sorting(arr,n);//选择排序//shell_sort(arr,n);      //希尔排序//insertion_Sort(arr,n);  //插入排序//quick_sort(arr,n);       //快速排序//int reg[6]={};
//	Merge_sort(arr,reg,0,n-1);//归并排序/*	int arr[]={3,100,22,0,2,5,6,73,6,9,22,16,88,7};sort_heap(arr,14);for(int i=0;i<14;i++){printf("%d ",arr[i]);	}printf("\n");*/return 0;
}

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

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

相关文章

LLVM 寄存器分配

概述 基本寄存器分配器是四种寄存器分配器中最简单的寄存器分配pass实现(<llvm_root/livm/lib/CodeGen/RegAllocBasic.cpp>) 但麻雀虽小&#xff0c;五脏俱全&#xff0c;基本寄存器分配器中实现了根据溢出权重确实虚拟寄存器优先级、按优先级分配物理寄存器&#xff0…

韦东山瑞士军刀项目自学之UART

放自己一星期假回家&#xff0c;回来继续准备秋招。 本章记录关于UART协议的相关知识笔记。平时主要还是基于HAL库开发&#xff0c;但笔记里也讲了韦老师介绍的如何控制寄存器来设置UART的参数。 以及一些UART防止采集的抖动设置的一些策略与波特率与比特率的区别等。

文件共享服务NFS(服务名nfs,端口tcp/2049)

目录 前言 配置文件 工作原理 NFS服务器的配置 查看服务器是否安装 查看服务器状态 开启服务 编写配置文件 客户端挂载 前言 NFS&#xff08;Network File System&#xff09;是一种分布式文件系统协议&#xff0c;它允许网络中的不同计算机共享文件和目录&#xff0…

使用tailwindcss轻松实现移动端rem适配

本示例节选自小卷全栈开发实战系列的《Vue3实战》。演示如何用tailwindcss所支持的rem体系轻松实现一个仿b站移动端头部导航栏rem适配。 友情声明 学习分享不易&#xff0c;如果小伙伴觉得有帮助&#xff0c;点赞支持下。满30赞&#xff0c;将随文附赠录屏讲解&#xff0c;感谢…

树莓派4/5:运行Yolov5n模型(文末附镜像文件)

〇、前言 因国内网络问题&#xff0c;可直接烧录文末镜像文件&#xff0c;或者按照本教程进行手动操作。 一、实验目的 在树莓派4B运行Yolov5n模型。 二、实验条件 1、Windows 11计算机&#xff1a;安装了Mobaxterm 2、树莓派4B&#xff1a;64Bit Lite OS&#xff0c;安装了…

案例:Nginx + Tomcat集群(负载均衡 动静分离)

目录 案例 案例环境 案例步骤 部署Tomcat服务器 部署Nginx服务器 实现负载均衡和读写分离 日志控制 案例 案例环境 操作系统 IP 地址 角色 CentOS 192.168.10.101 Nginx服务器&#xff08;调度器&#xff09; CentOS 192.168.10.102 Tomcat服务器① CentOS 1…

uniapp 对于scroll-view滑动和页面滑动的联动处理

需求 遇到一个需求 解决方案 这个时候可以做一个内页面滑动判断 <!-- scroll-y 做true或者false的判断是否滑动 --> <view class"u-menu-wrap" style"background-color: #fff;"><scroll-view :scroll-y"data.isGo" scroll-wit…

贷奇乐漏洞学习 --- 两个变态WAF绕过

代码分析 第一个WAF 代码 function dowith_sql($str) {$check preg_match(/select|insert|update|delete|\|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile/is, $str);if ($check) {echo "非法字符!";exit();}return $str;} 实现原理 这段PHP代码定义了一个…

uniapp切换同一个子组件时,钩子函数只进了一次

给子组件添加不同的 “key” 值&#xff0c;当 key 值改变时&#xff0c;Vue 会认为这是一个不同的组件&#xff0c;并重新创建它 props: ["L1Id"],// 方式1: 使用keycomputed: {// 切换子组件时,发现created、mounted等钩子函数只会进一次,或者用 keykey(){this.ref…

CSS技巧专栏:一日一例 19 -纯CSS实现超酷的水晶按钮特效

CSS技巧专栏:一日一例 19 -纯CSS实现超酷的水晶按钮特效 今天给大家分享一个纯CSS按钮水晶按钮,效果很赞,希望对大家有所帮助。 本例图片 案例分析 这个按钮看起来效果很赞,我们分析一下它由几个层组成: 1. 按钮本体:渐变层+按钮文字 2.用before伪元素实现高光层+内…

线程与多线程(二)

线程与多线程&#xff08;二&#xff09; 一、线程互斥1、相关概念 二、互斥锁1、介绍2、使用场景3、初始化&#xff08;1&#xff09;函数&#xff08;2&#xff09;概念 4、销毁&#xff08;1&#xff09;函数&#xff08;2&#xff09;概念 5、加锁&#xff08;1&#xff09…

SAM-Med2D 大模型学习笔记(续):训练自己数据集

1、前言、数据集介绍 SAM-Med2D大模型介绍参考上文&#xff1a;第三章&#xff1a;SAM-Med2D大模型复现-CSDN博客 本文将使用SAM-Med2D大模型训练自己的数据集 关于SAM-Med2D大模型官方demo数据集的介绍上文已经介绍过&#xff0c;这里简单回顾下 其中data_demo为数据集的目…

leetcode171. Excel 表列序号,进制转换

leetcode171. Excel 表列序号 给你一个字符串 columnTitle &#xff0c;表示 Excel 表格中的列名称。返回 该列名称对应的列序号 。 例如&#xff1a; A -> 1 B -> 2 C -> 3 … Z -> 26 AA -> 27 AB -> 28 … 示例 1: 输入: columnTitle “A” 输出: 1 示…

电商平台产品ID|CDN与预渲染|前端边缘计算

技术实现 都是通过ID拿到属性&#xff0c;进行预渲染html&#xff0c;通过 oss 分发出去 详情页这种基本都是通过 ssr 渲染出来&#xff0c;然后上缓存 CDN 分发到边缘节点来处理&#xff0c;具体逻辑可以参考 淘宝——EdgeRoutine边缘计算&#xff08;CDNServerless 边缘计算…

国内真正意义上的OpenAI,最强多模态大模型 MiniCPM-V 2.6 发布

最近这一两周看到不少互联网公司都已经开始秋招提前批了。不同以往的是&#xff0c;当前职场环境已不再是那个双向奔赴时代了。求职者在变多&#xff0c;HC 在变少&#xff0c;岗位要求还更高了。 最近&#xff0c;我们又陆续整理了很多大厂的面试题&#xff0c;帮助一些球友解…

二叉树的最大深度

二叉树的最大深度 思路&#xff1a; 法一&#xff1a;深搜 也就是递归 要想清楚边界条件 好久没写深搜了 回忆下怎么写。 突然就悟了&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *rig…

2024年6月 青少年机器人技术等级考试理论综合试卷(二级)

202406 青少年等级考试机器人理论真题二级 第 1 题 如图&#xff0c;这是飞机起飞时的机翼示意图&#xff0c;下列说法正确的是&#xff1f;&#xff08; &#xff09; A&#xff1a;机翼上侧所受的气压为0 B&#xff1a;机翼受到向下的力的作用 C&#xff1a;机翼下侧所受…

基于sklearn的机器学习 — 支持向量机(SVM)

支持向量机&#xff08;SVM&#xff1a;support vector machine&#xff09;另一种功能强大、应用广泛的学习算法&#xff0c;可应用于分类、回归、密度估计、聚类等问题。SVM可以看作是感知器&#xff08;可被视为一种最简单形式的前馈神经网络&#xff0c;是一种二元线性分类…

C++ 特殊类设计

目录 0.前言 1.设计一个不能被拷贝的类 1.1C98实现 1.2C11实现 2.设计一个只能在堆上创建对象的类 3.设计一个只能在栈上创建对象的类 4.设计一个不能被继承的类 4.1C98实现 4.2C11实现 5.设计只能创建一个对象的类&#xff08;单例模式&#xff09; 5.1设计模式简介 5.2单例模…

Jupyter nbextensions安装与使用

这里写自定义目录标题 Jupyter nbextensions安装与使用安装7以下版本&#xff0c;安装插件包推荐使用的插件 Jupyter nbextensions安装与使用 目前&#xff0c;jupyter版本升级到了7以上版本&#xff0c;导致其界面非常难看&#xff0c;因此&#xff0c;为了重回之前的使用界面…