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

news2025/4/24 1:47:48

扯谈

之前我已经把十大排序算法全讲了一遍(具体详见专栏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 = 1
    while max_num // exp > 0:
        counting_sort(arr, exp)
        exp *= 10
    return arr

def counting_sort(arr, exp):
    output = [0] * len(arr)
    count = [0] * 19  # 处理负数偏移
    for num in arr:
        index = (num // exp) % 10 + 9
        count[index] += 1
    for i in range(1, 19):
        count[i] += count[i - 1]
    for i in range(len(arr)-1, -1, -1):
        index = (arr[i] // exp) % 10 + 9
        output[count[index]-1] = arr[i]
        count[index] -= 1
    arr[:] = output

n = 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 10

void 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.coloradmin.cn/o/2341149.html

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

相关文章

DeepSeek和Excel结合生成动态图表

文章目录 一、前言二、3D柱状图案例2.1、pyecharts可视化官网2.2、Bar3d-Bar3d_puch_card2.3、Deepseek2.4、WPS2.5、动态调整数据 一、前言 最近在找一些比较炫酷的动态图表&#xff0c;用于日常汇报&#xff0c;于是找到了 DeepseekExcel王牌组合&#xff0c;其等同于动态图…

Ubuntu20.04 部署llama-factory问题集

llama3 微调教程之 llama factory 的 安装部署与模型微调过程&#xff0c;模型量化和gguf转换。_llamafactory 部署-CSDN博客 1.跟着教程 llama-factory下载不下来 来&#xff0c;试着换源&#xff0c;多试几次&#xff0c;就可以成功了。。。 2.跟着教程&#xff0c;发现无法…

大语言模型助力 Support Case 分析,提升云服务效率

1. 背景 技术工单&#xff08;Support Case&#xff09;是企业在进行云平台操作的时候通常会用到的一种技术支持类型&#xff0c;提供的技术支持通常包括所有的云服务的使用问题、账单问题、限制额度提升等等。对于云平台的管理者而言&#xff0c;对各个 BU 所提的工单进行统计…

ubuntu磁盘挂载

1、‌查看磁盘设备及分区‌ 命令‌&#xff1a;列出所有块设备&#xff08;磁盘及分区&#xff09; lsblk 0表示此块未挂载 2、格式化分区 sudo mkfs.ext4 /dev/sdb 注意sdb换成自己的块名称 3、创建挂载点目录‌ sudo mkdir -p /mnt/data4、永久挂载 sudo blkid /dev…

chili3d调试笔记8 打印零件属性 浏览器元素展开

无效&#xff0c; 返回的是节点不是坐标啥的&#xff0c; 找他的属性 把document和selectednote&#xff08;空集&#xff09;传给handleshowproperty方法 怎么获得selectnotes和selectnotes的property值 有selectnotes运行这段就行了 明天再搞 ----------------------------…

新书速览|DeepSeek移动端AI应用开发:基于Android与iOS

《DeepSeek移动端AI应用开发&#xff1a;基于Android与iOS》 1 本书内容 《DeepSeek移动端AI应用开发:基于Android与iOS》深入剖析了DeepSeek平台的架构原理、API调用及开发实践等核心内容&#xff0c;助力读者在Android与iOS移动端高效集成DeepSeek API&#xff0c;打造出契…

Android调用springboot接口上传大字段,偶现接口超时的优化

介绍 最近有个功能&#xff0c;Android通过okhttp上传实体类&#xff0c;实体类包含一个大字段&#xff0c;上传的字符串长度达到300k&#xff0c;偶现接口超时的情况&#xff0c;大概100次有5次&#xff0c;看日志发现数据并没有到达接口&#xff0c;可能在网络传输中就超时了…

react组件之间如何使用接收到的className(封装一个按钮案例)

带有hover渐变效果 一、父组件 import LineGradientBox from ../line-gradient-box; import styles from ./index.module.scss;<LineGradientBoxfontSize{20}className{styles.btn_height}textSign upwidth"100%"onClick{() > {navigate(/sign-up);}} /> …

JavaScript 数组常用方法解析

1. concat - 合并数组 语法&#xff1a; const newArray oldArray.concat(value1, value2, ..., arrayN); 作用&#xff1a; 将当前数组与其他数组或值合并&#xff0c;返回一个新数组&#xff0c;原数组不变。 测试案例&#xff1a; const arr1 [1, 2, 3]; const arr2…

09.传输层协议 ——— TCP协议

文章目录 TCP协议 谈谈可靠性TCP协议格式 序号与确认序号窗口大小六个标志位 确认应答机制&#xff08;ACK&#xff09;超时重传机制连接管理机制 三次握手四次挥手 流量控制滑动窗口拥塞控制延迟应答捎带应答面向字节流粘包问题TCP异常情况TCP小结基于TCP的应用层协议 TCP协…

数字化转型“变形记”:中钧科技经营帮如何让企业长出“智慧骨骼”

数字化转型就像给企业安装一个"智慧引擎"&#xff0c;而中钧科技的经营帮平台就是这台引擎的智能控制系统。让我们用"人体"来打个比方——当企业的数据、流程、决策像神经脉络般打通&#xff0c;才能真正实现灵活运转。下面就以经营帮的五大核心板块为例&a…

【问题解决】centos7已经不维护了,如何继续使用yum源?

背景 CentOS 7 已于2024年6月30日停止维护&#xff0c;在停止维护后我们之前配置的国内镜像源大多都是空目录了&#xff0c;即在线国内镜像源不可用,就像下边这样提示&#xff1a; [rootbogon yum.repos.d]# yum install vim 已加载插件&#xff1a;fastestmirror Loading mi…

Redis 接收连接

阅读本文前&#xff0c;建议先看&#xff1a;Redis 事件循环&#xff08;Event Loop&#xff09;。 Redis 6 支持接收 3 种连接&#xff0c;对应的接收处理器如下&#xff1a; TCP&#xff1a;acceptTcpHandler&#xff1b;TLS&#xff1a;acceptTLSHandler&#xff1b;Unix …

【计算机视觉】CV实战项目- Face-and-Emotion-Recognition 人脸情绪识别

Face-and-Emotion-Recognition 项目详细介绍 项目概述项目功能项目目录结构项目运行方式1. 环境准备2. 数据准备3. 模型训练4. 模型运行 常见问题及解决方法1. **安装依赖问题**2. **数据集问题**3. **模型训练问题**4. **模型运行问题** 项目实战建议项目参考文献 项目概述 F…

基于国产 FPGA+ 龙芯2K1000处理器+翼辉国产操作系统继电保护装置测试装备解决方案

0 引言 近年来&#xff0c;我国自主可控芯片在国家政策和政 府的支持下发展迅速&#xff0c;并在电力、军工、机械、 通信、电子、医疗等领域掀起了国产化替代之 风&#xff0c;但在芯片自主可控和国产化替代方面还有明 显的不足之处。 2022年我国集成电路进口量多 达 5 3…

如何批量为多个 Word 文档添加水印保护

在日常办公中&#xff0c;Word文档添加水印是一项重要的操作&#xff0c;特别是在需要保护文件内容的安全性和版权时。虽然Office自带了添加水印的功能&#xff0c;但当需要一次性给多个Word文档添加水印时&#xff0c;手动操作显得非常繁琐且低效。为了提高效率&#xff0c;可…

长期行为序列建模技术演进:从SIM到TWIN-v2

背景 在推荐系统与广告投放领域&#xff0c;长期行为序列建模旨在从用户数月甚至数年的历史行为中捕捉稳定兴趣模式&#xff0c;是解决冷启动、提升推荐精度的关键。随着工业界需求激增&#xff0c;SIM、ETA、SDIM、TWIN及TWIN-v2等模型相继诞生&#xff0c;推动技术不断革新。…

Linux下 REEF3D及DIVEMesh 源码编译安装及使用

目录 软件介绍 基本依赖 一、源码下载 1、REEF3D 2、DIVEMesh 二、解压缩 三、编译安装 1、REEF3D 2、DIVEMesh 四、算例测试 软件介绍 REEF3D是一款开源流体动力学框架&#xff0c;提供计算流体力学及波浪模型。软件采用高效并行化设计&#xff0c;可以在大规模处理器…

嵌入式软件测试的革新:如何用深度集成工具破解效率与安全的双重困局?

在汽车电子、工业控制、航空航天等嵌入式开发领域&#xff0c;团队常面临一个看似无解的悖论&#xff1a;如何在保证代码安全性的前提下&#xff0c;大幅提升测试效率&#xff1f; 传统测试工具往往需要搭建独立环境、插入大量桩代码&#xff0c;甚至需要开发者手动编写测试用例…

Ubuntu24.04安装ROS2问题

1&#xff0c;根据官方指导安装&#xff0c;安装到步骤&#xff1a; sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg 时遇到问题。导致sudo apt update一直报错&#xff1a; 找了几天的资料…