当前位置: 首页 > news >正文

排序算法--基数排序

核心思想是按位排序(低位到高位)。适用于定长的整数或字符串,如例如:手机号、身份证号排序。按数据的每一位从低位到高位(或相反)依次排序,每次排序使用稳定的算法(如计数排序)。

#include <stdlib.h>
// 获取数组中最大值(用于确定位数)
int getMax(int arr[], int n) {int max = arr[0];for (int i = 1; i < n; i++) {if (arr[i] > max) {max = arr[i];}}return max;
}// 使用计数排序对指定位数进行排序(exp=1,10,100...)
void countSort(int arr[], int n, int exp) {int* output = (int*)malloc(n * sizeof(int));  // 输出数组int count[10] = {0};                          // 十进制计数数组// 统计当前位数字出现次数for (int i = 0; i < n; i++) {count[(arr[i] / exp) % 10]++;}// 计算累计位置(稳定排序关键)for (int i = 1; i < 10; i++) {count[i] += count[i - 1];}// 反向填充保证稳定性(相同数字保持原顺序)for (int i = n - 1; i >= 0; i--) {output[count[(arr[i] / exp) % 10] - 1] = arr[i];count[(arr[i] / exp) % 10]--;}// 将排序结果复制回原数组for (int i = 0; i < n; i++) {arr[i] = output[i];}free(output);
}// 基数排序主函数(LSD:最低位优先)
void radixSort(int arr[], int n) {int max = getMax(arr, n);// 按每一位进行计数排序for (int exp = 1; max / exp > 0; exp *= 10) {countSort(arr, n, exp);}
}
#include <stdio.h>
// 打印数组
void printArray(int arr[], int n) {for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");
}int main() {int arr[] = {170, 45, 75, 90, 802, 24, 2, 66}; // 测试数据int n = sizeof(arr) / sizeof(arr[0]);printf("排序前: ");printArray(arr, n);radixSort(arr, n);printf("排序后: ");printArray(arr, n);return 0;
}

优化建议:

1.基数选择优化,使用更大的基数(如256),减少迭代次数,提升缓存利用率

2.内存预分配,预分配输出数组空间,减少多次内存分配开销

3负数处理,分离符号位单独处理,支持负数排序

扩展优化示例(支持负数)

void radixSortWithNegative(int arr[], int n) {// 分离正负数int* positive = malloc(n * sizeof(int));int* negative = malloc(n * sizeof(int));int pos_count = 0, neg_count = 0;for (int i = 0; i < n; i++) {if (arr[i] >= 0) {positive[pos_count++] = arr[i];} else {negative[neg_count++] = -arr[i]; // 取绝对值处理}}// 分别排序正负数radixSort(positive, pos_count);radixSort(negative, neg_count);// 合并结果(负数逆序)int index = 0;for (int i = neg_count - 1; i >= 0; i--) {arr[index++] = -negative[i];}for (int i = 0; i < pos_count; i++) {arr[index++] = positive[i];}free(positive);free(negative);
}

相关文章:

排序算法--基数排序

核心思想是按位排序&#xff08;低位到高位&#xff09;。适用于定长的整数或字符串&#xff0c;如例如&#xff1a;手机号、身份证号排序。按数据的每一位从低位到高位&#xff08;或相反&#xff09;依次排序&#xff0c;每次排序使用稳定的算法&#xff08;如计数排序&#…...

【AIGC魔童】DeepSeek核心创新技术(二):MLA

【AIGC魔童】DeepSeek核心创新技术&#xff08;二&#xff09;&#xff1a;MLA 1. MLA框架的定义与背景2. MLA框架的技术原理&#xff08;1&#xff09;低秩联合压缩&#xff08;2&#xff09;查询的低秩压缩&#xff08;3&#xff09;旋转位置嵌入&#xff08;RoPE&#xff09…...

Mac: docker安装以后报错Command not found: docker

文章目录 前言解决办法&#xff08;新的&#xff09;解决步骤&#xff08;原来的&#xff09;不推荐总结 前言 ​本操作参考 http://blog.csdn.net/enhenglhm/article/details/137955756 原作者&#xff0c;更详细请&#xff0c;查看详细内容请关注原作者。 一般&#xff0c;…...

Golang 并发机制-7:sync.Once实战应用指南

Go的并发模型是其突出的特性之一&#xff0c;但强大的功能也带来了巨大的责任。sync.Once是由Go的sync包提供的同步原语。它的目的是确保一段代码只执行一次&#xff0c;而不管有多少协程试图执行它。这听起来可能很简单&#xff0c;但它改变了并发环境中管理一次性操作的规则。…...

react关于手搓antd pro面包屑的经验(写的不好请见谅)

我们先上代码&#xff0c;代码里面都有注释&#xff0c;我是单独写了一个组件&#xff0c;方便使用&#xff0c;在其他页面引入就行了 还使用了官方的Breadcrumb组件 import React, { useEffect, useState } from react; import { Breadcrumb, Button } from antd; import { …...

Android修行手册-五种比较图片相似或相同

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材…...

设计模式.

设计模式 一、介绍二、六大原则1、单一职责原则&#xff08;Single Responsibility Principle, SRP&#xff09;2、开闭原则&#xff08;Open-Closed Principle, OCP&#xff09;3、里氏替换原则&#xff08;Liskov Substitution Principle, LSP&#xff09;4、接口隔离原则&am…...

使用PyCharm创建项目以及如何注释代码

创建好项目后会出现如下图所示的画面&#xff0c;我们可以通过在项目文件夹上点击鼠标右键&#xff0c;选择“New”菜单下的“Python File”来创建一个 Python 文件&#xff0c;在给文件命名时建议使用英文字母和下划线的组合&#xff0c;创建好的 Python 文件会自动打开&#…...

LabVIEW与PLC交互

一、写法 写命令立即读出 写命令后立即读出&#xff0c;在同一时间不能有多个地方写入&#xff0c;因此需要在整个写入后读出过程加锁 项目中会存在多个循环并行执行该VI&#xff0c;轮询PLC指令 在锁内耗时&#xff0c;就是TCP读写的实际耗时为5-8ms&#xff0c;在主VI六个…...

Idea 2024.3 使用CodeGPT插件整合Deepseek

哈喽&#xff0c;大家好&#xff0c;我是浮云&#xff0c;最近国产大模型Deepseek异常火爆&#xff0c;作为程序员我也试着玩了一下&#xff0c;首先作为简单的使用&#xff0c;大家进入官网&#xff0c;点击开始对话即可进行简单的聊天使用&#xff0c;点击获取手机app即可安装…...

[论文笔记] Deepseek-R1R1-zero技术报告阅读

启发: 1、SFT&RL的训练数据使用CoT输出的格式,先思考再回答,大大提升模型的数学与推理能力。 2、RL训练使用群体相对策略优化(GRPO),奖励模型是规则驱动,准确性奖励和格式化奖励。 1. 总体概述 背景与目标 报告聚焦于利用强化学习(RL)提升大型语言模型(LLMs)…...

VUE之组件通信(三)

1、$refs与$parent 1&#xff09;概述&#xff1a; $refs用于&#xff1a;父——>子。$parent用于&#xff1a;子——>父。 2&#xff09;原理如下&#xff1a; 属性说明$refs值为对象&#xff0c;包含所有被ref属性标识的DOM元素或组件实例。$parent值为对象&#x…...

【Redis实战】投票功能

1. 前言 现在就来实践一下如何使用 Redis 来解决实际问题&#xff0c;市面上很多网站都提供了投票功能&#xff0c;比如 Stack OverFlow 以及 Reddit 网站都提供了根据文章的发布时间以及投票数计算出一个评分&#xff0c;然后根据这个评分进行文章的展示顺序。本文就简单演示…...

linux常用基础命令 最新1

常用命令 查看当前目录下个各个文件大小查看当前系统储存使用情况查看当前路径删除当前目录下所有包含".log"的文件linux开机启动jar更改自动配置文件后操作关闭自启动linux静默启动java服务查询端口被占用查看软件版本重启关机开机启动取别名清空当前行创建文件touc…...

UnityShader学习笔记——多种光源

——内容源自唐老狮的shader课程 目录 1.光源类型 2.判断光源类型 2.1.在哪判断 2.2.如何判断 3.光照衰减 3.1.基本概念 3.2.unity中的光照衰减 3.3.光源空间变换矩阵 4.点光源衰减计算 5.聚光灯衰减计算 5.1.聚光灯的cookie&#xff08;灯光遮罩&#xff09; 5.2.聚…...

深入浅出谈VR(虚拟现实、VR镜头)

1、VR是什么鬼&#xff1f; 近两年VR这次词火遍网上网下&#xff0c;到底什么是VR&#xff1f;VR是“Virtual Reality”&#xff0c;中文名字是虚拟现实&#xff0c;是指采用计算机技术为核心的现代高科技手段生成一种虚拟环境&#xff0c;用户借助特殊的输入/输出设备&#x…...

项目2 车牌检测

检测车牌 1. 基本思想2. 基础知识2.1 YOLOV5(参考鱼苗检测)2.1.1 模型 省略2.1.2 输入输出 省略2.1.3 损失函数 省略2.2 LPRNet2.2.1 模型2.2.2 输入输出2.2.3 损失函数3. 流程3.1 数据处理3.1.1 YOLOV5数据处理3.2.2 LPRNet数据处理3.2 训练3.2.1 YOLOV5训练 省略3.2.2 LPRN…...

Linux: 网络基础

1.协议 为什么要有协议&#xff1a;减少通信成本。所有的网络问题&#xff0c;本质是传输距离变长了。 什么是协议&#xff1a;用计算机语言表达的约定。 2.分层 软件设计方面的优势—低耦合。 一般我们的分层依据&#xff1a;功能比较集中&#xff0c;耦合度比较高的模块层…...

【实战篇】巧用 DeepSeek,让 Excel 数据处理更高效

一、为何选择用 DeepSeek 处理 Excel 在日常工作与生活里,Excel 是我们频繁使用的工具。不管是统计公司销售数据、分析学生成绩,还是梳理个人财务状况,Excel 凭借其强大的功能,如数据排序、筛选和简单公式计算,为我们提供了诸多便利。但当面对复杂的数据处理任务,比如从…...

Flink CDC YAML:面向数据集成的 API 设计

摘要&#xff1a;本文整理自阿里云智能集团 、Flink PMC Member & Committer 徐榜江&#xff08;雪尽&#xff09;老师在 Flink Forward Asia 2024 数据集成&#xff08;一&#xff09;专场中的分享。主要分为以下四个方面&#xff1a; Flink CDC YAML API Transform A…...

提升开发效率:IntelliJ IDEA必备插件推荐与安装指南(2023最新版)

2023年IntelliJ IDEA插件生态深度解析&#xff1a;从效率工具到全栈开发支持 JetBrains家族的IntelliJ IDEA早已超越普通代码编辑器的范畴&#xff0c;成为现代开发者手中的瑞士军刀。但鲜有人意识到&#xff0c;真正让这把军刀所向披靡的&#xff0c;是背后超过5000个官方认证…...

2026年探访阎良:这三家头疗肩颈养生馆的服务为何备受好评?

在快节奏的现代生活中&#xff0c;头颈肩的亚健康问题几乎成了都市人的“标配”。头痛、失眠、肩颈僵硬&#xff0c;这些困扰背后&#xff0c;是人们对专业、有效且放松的养生服务的迫切需求。近期&#xff0c;笔者深入西安市阎良区&#xff0c;实地探访了三家在本地口碑颇佳的…...

JAVA面试-equals与==的本质区别

Java中 与 equals() 的区别是面试和日常开发的核心知识点&#xff0c;其核心差异在于比较的对象&#xff1a; 是比较引用地址或基本类型的值&#xff0c;而 equals() 是比较对象的内容&#xff0c;但其默认行为与重写密切相关 。 为了清晰地理解&#xff0c;我们可以将比较场…...

Node.js版本管理神器NVM:从安装到实战的保姆级教程(Mac版)

Node.js版本管理神器NVM&#xff1a;从安装到实战的保姆级教程&#xff08;Mac版&#xff09; 作为一名长期在Mac环境下工作的前端开发者&#xff0c;我深刻体会到Node.js版本管理的重要性。不同项目可能依赖不同版本的Node.js&#xff0c;而手动切换版本不仅麻烦还容易出错。N…...

Phi-3-mini-4k-instruct-gguf详细步骤:模型升级路径与q4/q5_k_m量化对比测试

Phi-3-mini-4k-instruct-gguf详细步骤&#xff1a;模型升级路径与q4/q5_k_m量化对比测试 1. 模型概述与使用场景 Phi-3-mini-4k-instruct-gguf是微软Phi-3系列中的轻量级文本生成模型GGUF版本&#xff0c;特别适合以下应用场景&#xff1a; 智能问答系统文本改写与润色内容摘…...

摒弃固定显示界面,程序根据使用场景,自动切换显示界面(简洁版/详细版),适配不同需求。

一、 实际应用场景描述 (Scenario)假设你正在开发一台高精度光谱分析仪。这台设备有三种典型的使用者&#xff1a;1. 研发工程师&#xff08;R&D&#xff09;&#xff1a;在实验室调试光路和算法。他们需要看到原始 ADC 值、温度漂移曲线、信噪比等详细数据。2. 质检员&…...

React-Grid-Layout外部拖拽:从零构建可视化编辑体验

React-Grid-Layout外部拖拽&#xff1a;从零构建可视化编辑体验 【免费下载链接】react-grid-layout A draggable and resizable grid layout with responsive breakpoints, for React. 项目地址: https://gitcode.com/gh_mirrors/re/react-grid-layout 在构建现代Web应…...

如何在个人设备上节省97%存储空间:革命性RAG系统LEANN的完整指南

如何在个人设备上节省97%存储空间&#xff1a;革命性RAG系统LEANN的完整指南 【免费下载链接】LEANN RAG on Everything with LEANN. Enjoy 97% storage savings while running a fast, accurate, and 100% private RAG application on your personal device. 项目地址: http…...

零基础玩转像素心智:手把手教你用情绪解码器分析用户评论

零基础玩转像素心智&#xff1a;手把手教你用情绪解码器分析用户评论 1. 认识像素心智情绪解码器 1.1 什么是情绪解码器 像素心智情绪解码器(Pixel Mind Decoder)是一款基于M2LOrder核心引擎构建的AI情绪识别工具。它将复杂的自然语言处理技术封装在一个充满复古游戏风格的1…...

STM32 PWR电源管理与低功耗模式实战指南

1. STM32电源管理基础与实战意义 在嵌入式系统开发中&#xff0c;电源管理往往是最容易被忽视却至关重要的环节。想象一下你的智能手环如果每天都需要充电&#xff0c;或者无线传感器节点每隔几小时就要更换电池&#xff0c;这样的产品显然缺乏实用价值。STM32的PWR模块正是为解…...