洛谷P1177【模板】排序:十种排序算法全解(1)

扯谈

之前我已经把十大排序算法全讲了一遍(具体详见专栏C++排序算法),今天我们来用一道简单的题目总结实战一下。


算法实现

一、桶排序(Bucket Sort)

适用场景‌:数据范围已知且较小(需根据测试数据调整偏移量)

// Java
import java.io.*;
public class Main {static final int OFFSET = 100000;public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));int n = Integer.parseInt(br.readLine());int[] cnt = new int[200001];String[] strs = br.readLine().split(" ");for (int i = 0; i < n; i++) cnt[Integer.parseInt(strs[i]) + OFFSET]++;StringBuilder sb = new StringBuilder();for (int i = 0; i <= 200000; i++) while (cnt[i]-- > 0) sb.append(i - OFFSET).append(" ");System.out.println(sb);}
}
# Python
n = int(input())
nums = list(map(int, input().split()))
offset = 10**5
cnt = [0] * (2*10**5 +1)
for num in nums:cnt[num + offset] +=1
res = []
for i in range(len(cnt)):while cnt[i] >0:res.append(str(i - offset))cnt[i] -=1
print(' '.join(res))
// C
#include <stdio.h>
#define OFFSET 100000
int cnt[200001];
int main() {int n, x;scanf("%d", &n);for(int i=0; i<n; ++i) {scanf("%d", &x);cnt[x + OFFSET]++;}for(int i=0; i<=200000; ++i)while(cnt[i]--) printf("%d ", i - OFFSET);return 0;
}
// C++
#include <iostream>
using namespace std;
const int OFFSET = 1e5;
int cnt[200001];
int main() {ios::sync_with_stdio(false);int n, x;cin >> n;for(int i=0; i<n; ++i) {cin >> x;cnt[x + OFFSET]++;}for(int i=0; i<=200000; ++i)while(cnt[i]--) cout << i - OFFSET << " ";return 0;
}

二、基数排序(Radix Sort)

支持正负数处理

// Java
import java.io.*;
public class Main {static final int RADIX = 10;public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));int n = Integer.parseInt(br.readLine());String[] strs = br.readLine().split(" ");int[] arr = new int[n];for (int i = 0; i < n; i++) arr[i] = Integer.parseInt(strs[i]);// 分离正负数int posCount = 0;for (int num : arr) if (num >= 0) posCount++;int[] negs = new int[n - posCount];int[] poss = new int[posCount];int ni = 0, pi = 0;for (int num : arr) {if (num < 0) negs[ni++] = -num;else poss[pi++] = num;}// 排序负数if (negs.length > 0) radixSort(negs);// 排序正数if (poss.length > 0) radixSort(poss);// 合并结果StringBuilder sb = new StringBuilder();for (int i = negs.length - 1; i >= 0; i--) sb.append(-negs[i]).append(" ");for (int num : poss) sb.append(num).append(" ");System.out.println(sb);}static void radixSort(int[] arr) {int max = 0;for (int num : arr) if (num > max) max = num;for (exp = 1; max / exp > 0; exp *= 10) countingSort(arr, exp);}static void countingSort(int[] arr, int exp) {int[] output = new int[arr.length];int[] count = new int[RADIX];for (int num : arr) count[(num / exp) % RADIX]++;for (int i = 1; i < RADIX; i++) count[i] += count[i - 1];for (int i = arr.length - 1; i >= 0; i--) {int digit = (arr[i] / exp) % RADIX;output[--count[digit]] = arr[i];}System.arraycopy(output, 0, arr, 0, arr.length);}
}
# Python
def radix_sort(arr):if not arr:return []max_num = max(map(abs, arr))exp = 1while max_num // exp > 0:counting_sort(arr, exp)exp *= 10return arrdef counting_sort(arr, exp):output = [0] * len(arr)count = [0] * 19  # 处理负数偏移for num in arr:index = (num // exp) % 10 + 9count[index] += 1for i in range(1, 19):count[i] += count[i - 1]for i in range(len(arr)-1, -1, -1):index = (arr[i] // exp) % 10 + 9output[count[index]-1] = arr[i]count[index] -= 1arr[:] = outputn = int(input())
arr = list(map(int, input().split()))
neg = [x for x in arr if x < 0]
pos = [x for x in arr if x >= 0]
radix_sort(neg)
radix_sort(pos)
neg = [-x for x in reversed(neg)]
print(' '.join(map(str, neg + pos)))
// C
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define RADIX 10void counting_sort(int arr[], int n, int exp) {int* output = (int*)malloc(n * sizeof(int));int count[19] = {0}; // 处理负数偏移for (int i = 0; i < n; i++) {int digit = (arr[i] / exp) % RADIX + 9;count[digit]++;}for (int i = 1; i < 19; i++) count[i] += count[i-1];for (int i = n-1; i >= 0; i--) {int digit = (arr[i] / exp) % RADIX + 9;output[--count[digit]] = arr[i];}memcpy(arr, output, n * sizeof(int));free(output);
}void radix_sort(int arr[], int n) {if (n == 0) return;int max_val = 0;for (int i = 0; i < n; i++) {int abs_val = abs(arr[i]);if (abs_val > max_val) max_val = abs_val;}for (int exp = 1; max_val/exp > 0; exp *= 10)counting_sort(arr, n, exp);
}int main() {int n;scanf("%d", &n);int* arr = malloc(n * sizeof(int));for (int i = 0; i < n; i++) scanf("%d", &arr[i]);// 分离正负数int neg_count = 0;for (int i = 0; i < n; i++) if (arr[i] < 0) neg_count++;int* negs = malloc(neg_count * sizeof(int));int* poss = malloc((n - neg_count) * sizeof(int));int ni = 0, pi = 0;for (int i = 0; i < n; i++) {if (arr[i] < 0) negs[ni++] = -arr[i];else poss[pi++] = arr[i];}radix_sort(negs, neg_count);radix_sort(poss, n - neg_count);// 合并结果for (int i = neg_count-1; i >= 0; i--) printf("%d ", -negs[i]);for (int i = 0; i < n - neg_count; i++) printf("%d ", poss[i]);return 0;
}
// C++
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;void counting_sort(vector<int>& arr, int exp) {vector<int> output(arr.size());int count[19] = {0}; // 负数偏移处理for (int num : arr) count[(num / exp) % 10 + 9]++;for (int i = 1; i < 19; i++) count[i] += count[i-1];for (int i = arr.size()-1; i >= 0; i--) {int digit = (arr[i] / exp) % 10 + 9;output[--count[digit]] = arr[i];}arr = output;
}void radix_sort(vector<int>& arr) {if (arr.empty()) return;int max_val = 0;for (int num : arr) max_val = max(max_val, abs(num));for (int exp = 1; max_val/exp > 0; exp *= 10)counting_sort(arr, exp);
}int main() {ios::sync_with_stdio(false);int n; cin >> n;vector<int> arr(n), negs, poss;for (int i = 0; i < n; i++) {cin >> arr[i];if (arr[i] < 0) negs.push_back(-arr[i]);else poss.push_back(arr[i]);}radix_sort(negs);radix_sort(poss);reverse(negs.begin(), negs.end());for (int num : negs) cout << -num << " ";for (int num : poss) cout << num << " ";return 0;
}

由于篇幅限制,剩余请详见洛谷P1177【模板】排序:十种排序算法全解(2),求关

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

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

相关文章

SuperMap iClient3D for WebGL 如何加载WMTS服务

在 SuperMap iClient3D for WebGL 中加载WMTS服务时&#xff0c;参数配置很关键&#xff01;下面我们详细介绍如何正确填写参数&#xff0c;确保影像服务完美加载。 一、数据制作 对于上述视频中的地图制作&#xff0c;此处不做讲述&#xff0c;如有需要可访问&#xff1a;Onl…

再读bert(Bidirectional Encoder Representations from Transformers)

再读 BERT&#xff0c;仿佛在数字丛林中邂逅一位古老而智慧的先知。初次相见时&#xff0c;惊叹于它以 Transformer 架构为罗盘&#xff0c;在预训练与微调的星河中精准导航&#xff0c;打破 NLP 领域长久以来的迷雾。而如今&#xff0c;书页间跃动的不再仅是 Attention 机制精…

从零开始 保姆级教程 Ubuntu20.04系统安装MySQL8、服务器配置MySQL主从复制、本地navicat远程连接服务器数据库

从零开始&#xff1a;Ubuntu 20.04 系统安装 MySQL 8、服务器配置 MySQL 主从复制、本地 Navicat 远程连接服务器数据库 初始化服务器1. 更新本地软件包列表2. 安装 MySQL 服务器3. 查看 MySQL 安装版本4. 登录 MySQL 管理终端5. 设置 root 用户密码&#xff08;推荐使用 nativ…

java怎么完善注册,如果邮箱中途更换,能否判断

解析在下面 附赠代码 private static class CodeInfo {String code;long timestamp;CodeInfo(String code, long timestamp) {this.code code;this.timestamp timestamp;}}// 存储验证码&#xff08;邮箱 -> 验证码信息&#xff09;(保证线程安全) 以免中途更改邮箱pri…

n8n 中文系列教程_01. 简单易懂的现代AI魔法,n8n的快速了解与概念科普(文末有彩蛋)

1. 教程简介 欢迎来到“无代码工具探索”课程&#xff0c;这是专为非技术人员设计的指南&#xff08;当然&#xff0c;技术人员也可以从中受益&#xff09;。我们的目标是通过无代码工具来提升工作效率&#xff0c;尤其是利用像 n8n 这样的灵活数据库平台。这些工具被誉为“现…

解码 Web Service:从技术原理到应用场景的深度剖析

Web Service 是一种基于网络的、分布式的计算技术&#xff0c;它允许不同的应用程序之间通过网络进行通信和交互。以下是关于 Web Service 的详细介绍&#xff1a; 一、定义与概念 Web Service 是一种可以通过 Web 协议&#xff08;如 HTTP&#xff09;进行访问的软件组件&am…

Nacos启动报错

Nacos启动是在单机模式下&#xff0c;不是集群模式 点击startup.cmd启动会报错 打开bin目录 rem是注释的意思&#xff0c;在nacos1.3.2之后&#xff0c;nacos默认的都是集群模式&#xff0c;我们这里单机测试就是用单机模式。 也可以修改MODE&#xff0c;如果选择不修改&…

uniapp-商城-26-vuex 使用流程

为了能在所有的页面都实现状态管理&#xff0c;我们按照前面讲的页面进行状态获取&#xff0c;然后再进行页面设置和布局&#xff0c;那就是重复工作&#xff0c;vuex 就会解决这样的问题&#xff0c;如同类、高度提炼的接口来帮助我们实现这些重复工作的管理。避免一直在造一样…

Git 命令速查手册

听说用美图可以钓读者&#xff1f; 一、基础操作核心命令 1. 仓库初始化与克隆 命令作用示例git init创建新仓库git init my-projectgit clone克隆远程仓库git clone [https://github.com/user/repo.git](https://github.com/user/repo.git)git remote add关联远程仓库git re…

信息量、香农熵、交叉熵、KL散度总结

信息量 对于一个事件而言&#xff0c;它一般具有三个特征&#xff1a; 小概率事件往往具有较大的信息量 大概率事件往往具有较小的信息量 独立事件的信息量相互可以相加 比如我们在买彩票这个事件中&#xff0c;彩票未中奖的概率往往很高&#xff0c;对我们而言一点也不稀…

使用C语言的cJSON中给JSON字符串添加转义

在 cJSON 库中&#xff0c;没有直接提供 一个函数来专门给 JSON 字符串添加转义&#xff08;如将 " 转义为 \"&#xff0c;\n 转义为 \\n 等&#xff09;。 但 cJSON 在 序列化&#xff08;cJSON_Print 或 cJSON_PrintUnformatted&#xff09; 时会自动处理转义字符…

宇树机器狗go2—slam建图(1)点云格式

0.前言 上一篇番外文章教大家如何在宇树机器狗go2的gazebo仿真环境中实现简单的导航运动&#xff0c;本期文章会教大家如何让宇树的机器狗go2在仿真环境中进行slam建图时经常会遇到的一些点云格式&#xff0c;在后续的slam建图和slam算法解析的时候会经常与这些点云信息打交道…

linux socket编程之udp(实现客户端和服务端消息的发送和接收)

目录 一.创建socket套接字(服务器端) 二.bind将prot与端口号进行绑定(服务器端) 2.1填充sockaddr_in结构 2.2bind绑定端口 三.直接通信(服务器端) 3.1接收客户端发送的消息 3.2给客户端发送消息 四.客户端通信 4.1创建socket套接字 4.2客户端bind问题 4.3直接通信即可…

第1期:Python基础语法入门

1.1 Python简介 Python是一种解释型、面向对象、动态数据类型的高级编程语言。它设计简洁&#xff0c;易于学习&#xff0c;适合初学者。Python广泛应用于数据科学、人工智能、Web开发、自动化脚本等领域。它的语法简洁易懂&#xff0c;强调代码的可读性。 1.2 安装Python与配…

使用EXCEL绘制平滑曲线

播主播主&#xff0c;你都多少天没更新了&#xff01;&#xff01;&#xff01;泥在干什么&#xff1f;你还做这个账号麻&#xff1f;&#xff01;&#xff01;&#xff01; 做的做的&#xff08;哭唧唧&#xff09;&#xff0c;就是最近有些忙&#xff0c;以及…… 前言&…

当算力遇上马拉松:一场科技与肉身的极限碰撞

目录 一、从"肉身苦修"到"科技修仙" 二、马拉松的"新大陆战争" 三、肉身会被算法"优化"吗? 马拉松的下一站是"人机共生"时代 当AI能预测你的马拉松成绩,算法能规划最佳补给方案,智能装备让训练效率翻倍——你还会用传…

MLLMs for TSAD ?

项目链接:Multimodal LLMs Advance Time Series Analysis 代码链接:https://github.com/mllm-ts/VisualTimeAnomaly 出处:ICLR 2025 一 文章动机 多模态 LLM (MLLM) 通过 “视觉” 方式处理时序的潜力仍未充分探索; 人类检测 “时序异常” 的自然方式:可视化、文本描…

开发基于python的商品推荐系统,前端框架和后端框架的选择比较

开发一个基于Python的商品推荐系统时&#xff0c;前端和后端框架的选择需要综合考虑项目需求、开发效率、团队熟悉度以及系统的可扩展性等因素。 以下是一些推荐的框架和建议&#xff1a; 后端框架 Flask 优点&#xff1a; 轻量级&#xff1a;Flask的核心非常简洁&#xff0c;…

chili3d调试笔记2+添加web ui按钮

onclick 查找 打个断点看看 挺可疑的&#xff0c;打个断点看看 挺可疑的&#xff0c;打个断点看看 打到事件监听上了 加ui了 加入成功 新建弹窗-------------------------------------- 可以模仿这个文件&#xff0c;写弹窗 然后在这里注册一下&#xff0c;外部就能调用了 对了…

【重学Android】1.关于@Composer注解的一点知识笔记

最新因为一些原因&#xff0c;开始重新学习Android及kotlin编程&#xff0c;也觉得可以顺带记录下这个过程中的一些知识点&#xff0c;也可以用作日后自己查找复习。 Composable 注解在 Android 开发中的使用 Composable 是 Jetpack Compose&#xff08;Android 的现代声明式…