首页 > 其他分享 >基数排序

基数排序

时间:2023-07-06 17:33:26浏览次数:31  
标签:214 int 345 基数排序 135 排序 ct

最近又有个奇奇怪怪的题目,数据为 \(n \le 1 \times 10^7\),并且还要用到排序,普通的排序肯定会超时,然后就发现了一种 \(O(n)\)

介绍

基数排序(Radix Sort)是桶排序的扩展,它是将整数按位数切割成不同的数字,然后按每个数位分别比较以此来排序。

说详细点,也就是将所有数字统一为同样的长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。然后从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。

下面就用表格来做个详细的解释:

最开始的序列
214
135
413
435
533
345
532
421
654
431

既然从小到大排序,那么先排个位。

排完个位后
421
431
532
413
533
214
654
135
435
345

再排十位

排完十位后
413
214
421
431
532
533
135
435
345
654

最后再排百位

排完百位后
135
214
345
413
421
431
435
532
533
654

这便是最后的序列。

过程

1.查找数组a的最大值,并求出最大值的位数,作为循环的次数

2.统计所有数字某一位,用个桶 \(ct\) 来记个数。

3.然后做个前缀和ct[i]+=ct[i-1],那么每个数的某一位 \(x\) 的排名就应该在 \(ct[x-1]+1 \sim ct[x]\)。

4.然后按照上一次排序的结果,利用 \(ct\) 逐一放进另一个数组,再赋值到原来数组上。

5.重复进行(2)(3)(4)的操作。

代码

int maxbit(int a[],int n){
    int maxx=0;
    for(int i=1;i<=n;i++){
        int s=0,p=a[i];
        while(p!=0){
            p=p/10;
            s++;
        }
        maxx=max(maxx,s);
    }
    return maxx;
}
void Radix_Sort(int a[],int n){
    int m=maxbit(a,n),g=1;
    for(int t=0;t<=m;t++){
        for(int i=0;i<=9;i++)
            ct[i]=0;
        for(int i=1;i<=n;i++){
            int p=(a[i]/g)%10;
            ct[p]++;
        }
        for(int i=1;i<=9;i++) ct[i]+=ct[i-1];
        for(int i=n;i>=1;i--){
            int p=(a[i]/g)%10;
            rak[ct[p]]=a[i];
			ct[p]--;
        }
        for(int i=1;i<=n;i++){
        	a[i]=rak[i];
        }
        g=g*10;
    }
}

标签:214,int,345,基数排序,135,排序,ct
From: https://www.cnblogs.com/pdpdzaa/p/17532682.html

相关文章

  • 基本算法-基数排序
    思想当我们需要对一组数据进行排序时,常规的排序算法(如快速排序、归并排序等)通常是比较排序,即通过比较元素之间的大小关系来进行排序。但有时候我们需要对一组数据按照它们的“数字位”进行排序,此时比较排序并不是最优的选择,这时候基数排序就显得非常有效了。基数排序是一种非比......
  • 排序算法-基数排序
    基数排序RadixSort1.RadixSort介绍RadixSort属于“分配式排序”(DistributionSort),又称“桶子法”(BucketSort),其是通过比较待排序序列的所有元素的各个位的值,将元素分配至“桶”中,以达到排序的目的。RadixSort是一种效率较高且稳定的排序算法,其是桶排序的扩展。RadixSor......
  • Java中常用排序算法及示例-冒泡排序、希尔排序、选择排序、插入排序、合并排序、基数
    场景Java中需要对数据进行排序处理,常用的排序算法以及示例进行归纳整理。注:实现1、冒泡排序冒泡排序法又称为交换排序法,原理是从第一个元素开始,比较相邻元素的大小,若大小顺序有误,则对调后再进行下一个元素的比较。如此扫描一次之后就可以确保最后一个元素位于正确的顺序,接着逐步进......
  • Java中常用排序算法及示例-冒泡排序、希尔排序、选择排序、插入排序、合并排序、基数
    场景Java中需要对数据进行排序处理,常用的排序算法以及示例进行归纳整理。注:博客:https://blog.csdn.net/badao_liumang_qizhi实现1、冒泡排序冒泡排序法又称为交换排序法,原理是从第一个元素开始,比较相邻元素的大小,若大小顺序有误,则对调后再进行下一个元素的比较。如此扫描......
  • 【基数排序算法详解】Java/Go/Python/JS/C不同语言实现
    说明基数排序(RadixSort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的......
  • 【八大数据排序法】基数排序法的图形理解和案例实现 | C++
    第二十章基数排序法:::hljs-center目录第二十章基数排序法●前言●认识排序●一、基数排序法是什么?1.简要介绍2.图形理解3.算法分析●二、案例实现1.......
  • 基数排序(Radix Sort)
    一、算法概述1.1算法分类十种常见排序算法可以分为两大类:比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排......
  • 常见排序算法之基数排序
    文章目录​​1、概述​​​​2、测试代码​​​​3、测试小案例​​1、概述基数排序(radixsort)属于“分配式排序”(distributionsort),又称“桶子法”(bucketsort)或binsort,顾......
  • 基于桶的排序之基数排序以及排序方法总结
    基于桶的排序之基数排序以及排序方法总结作者:Grey原文地址:博客园:基于桶的排序之基数排序以及排序方法总结CSDN:基于桶的排序之基数排序以及排序方法总结说明基于桶的......
  • [排序算法] 基数排序 (C++)
    基数排序解释基数排序基数排序RadixSort是一种非基于比较的排序算法。在基数排序中,和计数排序、桶排序的思想类似,我们要再次用到桶这个东西。......