首页 > 编程语言 >必学排序算法——基数排序

必学排序算法——基数排序

时间:2024-10-26 22:16:51浏览次数:3  
标签:int 复杂度 必学 算法 基数排序 位数 排序

目录

前言

基数排序算法是必须掌握的一种基础算法,在一些比较出名的竞赛acm、蓝桥杯,并且在一些公司面试题中都可能会出现,而且作为简单题我们必须要拿下,所以我们要引起重视,下面让我们来深入了解基数排序算法。

一、什么是基数排序

基数排序(Radix Sort)是一种非比较型整数排序算法,通常用于对数字进行排序。它的基本思想是将数字按位(从最低有效位到最高有效位,或从最高有效位到最低有效位)进行排序,通常使用计数排序或桶排序作为子排序算法。基数排序的时间复杂度为 O(nk),其中 n 是待排序的数字个数,k 是数字的最大位数。

二、算法思想

基数排序的算法思想可以概括为以下步骤:
第一步、获取待排序元素的最大值,并确定其位数。
第二步、从最低位开始,依次对所有元素进行“分配“和“收集“操作。
第三步、在每一位上,根据该位上数字的值将元素分配到相应的桶中。
第四步、对每个桶中的元素进行顺序收集,得到排序后的部分结果,
重复上述步骤,直到对所有位都进行了排序。

三、算法分析

1、时间复杂度

它的时间复杂度为 O(d(n+r)),其中 d是数字的位数,n 是待排序元素的数量,r 是基数(radix)
基数排序的时间复杂度主要取决干数字的位数和待排序元素的数量。对干位数较少的情况,基数排序的效率较高,因为它不需要进行元素间的比较。然而,当数字的位数较多时,可能需要较多的“分配”和“收集”操作,导致时
间复杂度增加。

2、空间复杂度

在空间复杂度方面,基数排序需要额外的存储空间来存储桶。具体的空间复杂度取决于使用的桶的数量和存储桶的方式。

四、算法的优点

1.基数排序不需要进行元素间的比较,因此对于一些特殊情况(如排序范围有限、元素具有特定的顺序等)
它可能比比较型排序算法更有效。
2.基数排序可以很容易地用于排序具有固定宽度的数字序列,如电话号码、身份证号码等。

五、算法的缺点

1.基数排序需要额外的空间来存储桶,对于大型数据集可能会消耗较多的内存。
2.对于复杂的数据类型或非整数类型,可能需要进行额外的处理来实现基数排序。

六、优化方案

1.对于数字位数较多的情况,可以考虑使用其他排序算法,如快速排序、归并排序等
2.在实际应用中,可以根据数据的特点和排序要求,选择合适的排序算法组合,以达到更好的排序效果。

七、动态图解

在这里插入图片描述

八、经典例题

1.排序数组

代码题解

class Solution {
    const int maxn=50005;//数组长度
    const int base=10;//进制数
    const int maxt=7;//位数个数

void radixSort(vector<int>&a){
    int n=a.size();
    int powOfbase[maxt];//存放1 10 100 ... 1000000 的数用于遍历元素每一位
    powOfbase[0]=1;
    for(int i=1;i<maxt;i++){
        powOfbase[i]=powOfbase[i-1]*base;
    }
    int radixBucket[base][maxn];//二位数组用于顺序存放位数大小的值
    int radixBucketTop[base];//代表每位该数字有几个

    for(int i=0;i<n;i++){
        a[i]+=powOfbase[maxt-1];//因为有负数所以将所有数加上范围最大值,变为正数
    }
    int pos=0;
    while(pos<maxt){
        memset(radixBucketTop,0,sizeof(radixBucketTop));
        for(int i=0;i<n;i++){
            int rdx=a[i]/powOfbase[pos]%base;
            radixBucket[rdx][radixBucketTop[rdx]++]=a[i];//将每一位数塞进顺序塞进桶里
        }
        int top=0;
        for(int i=0;i<base;i++){
            for(int j=0;j<radixBucketTop[i];j++){
                a[top++]=radixBucket[i][j];//在重新小到大将桶里的值赋给结果数组
            }
        }
        pos++;
    }
    for(int i=0;i<n;i++){
        a[i]-=powOfbase[maxt-1];//再将排好序的数减回最大值
    }
}
    
public:
    vector<int> sortArray(vector<int>& a) {
        radixSort(a);
        return a;
    }
};

九、结语

学习算法是一个很艰难,漫长的过程,我们要克服一切困难,学习算法本就是由易到难,我相信通过我们坚持不懈的努力一定能理解并熟练掌握其中细节,加油,你一定能行。
在这里插入图片描述
关注我让我们一起学习编程,希望大家能点赞关注支持一下,让我有持续更新的动力,谢谢大家在这里插入图片描述

标签:int,复杂度,必学,算法,基数排序,位数,排序
From: https://blog.csdn.net/ycs66/article/details/143221452

相关文章

  • 每日OJ题_牛客_NC383主持人调度(一)_排序​_C++_Java
    目录牛客_NC383主持人调度(一)_排序题目解析C++代码Java代码牛客_NC383主持人调度(一)_排序主持人调度(一)_牛客题霸_牛客网(nowcoder.com)描述:        有n 个活动即将举办,每个活动都有开始时间与活动的结束时间,第i 个活动的开始时间是starti ,第i 个活动......
  • 冒泡排序的学习
     冒泡排序法的特点:升序排序中每一轮比较会把最大的数下沉到最底,所以相互比较的次数每一轮都会比前一轮少一次。#include<stdio.h>#include<stdlib.h>voidbubblesort(int*A,intsize){ inti,j; for(i=0;i<size-1;i++) { for(j=0;j<size-1-i......
  • 非递归快速排序
    importrandomdefquick(alist):#非递归assertlen(alist)>=2q=[]q.append((0,len(alist)-1))whileq:start,end=q.pop()mid=alist[start]#midisthepivotofthepartitionlow=......
  • Oracle 排序
    在Oracle中,使用ORDERBY语法按字符串进行排序ASC或DESC关键字:指定升序或降序排序,默认情况下,排序是升序的。NULLSFIRST或NULLSLAST关键字:指定对空值的处理方式,默认情况下,空值排在最后。--按升序排序,空值排在最后SELECTcolumn_nameFROMtable_nameORDERBYcolumn_na......
  • 提取路径,只保留数字,并且从大到小排序
    importosimportre#目录路径directory_path='./train'#用于存储提取的数字(作为整数)的列表extracted_numbers=[]#获取目录下的所有文件和子目录名称files_and_dirs=os.listdir(directory_path)#遍历文件和子目录名称fornameinfiles_and_dirs:#......
  • Ruoyi 之前端控制排序方式
           由于在与前端对接接口时,动态排序的需求较多,导致代码结构混乱,严重影响了后端的代码质量,并且修改频繁。参考了Ruoyi的分页排序插件 startPage,我对其进行了改进,开发出了自己的 startPagePlus。1、参考Ruoyi本身的startPage。在BaseController下添加 startPage......
  • (分享源码)计算机毕业设计必看必学 上万套实战教程手把手教学JAVA、PHP,node.js,C++、pyth
    摘 要大数据时代下,数据呈爆炸式地增长。为了迎合信息化时代的潮流和信息化安全的要求,利用互联网服务于其他行业,促进生产,已经是成为一种势不可挡的趋势。在网络小说的要求下,开发一款整体式结构的小说网站,将复杂的系统进行拆分,能够实现对需求的变化快速响应、系统稳定性的保......
  • 排序
    Unity常用排序算法冒泡排序冒泡排序算法,它是最慢的排序算法之一,但也是一种容易实现的排序算法。比较相邻的数据functionmaopao(list){letlen=list.length;for(leti=0;i<len;i++){//控制循环的次数for(letj=0;j<len-i-1;j++){//控制每次循环......
  • P7910 [CSP-J 2021] 插入排序 题解
    正解首先要注意$2$点:修改数组元素的值会影响接下来的操作.对数组进行排序不会影响接下来的操作.思路直接扫一遍数组.假设排序后$a_x$会在第$p$位上.将$p$初始化为$n$.然后就开始找$x$前后有多少个小于$a_x$的值就行了.时间复杂度:$\Theta(nq)$.注意......
  • 快速排序
    一、快速排序的介绍快速排序简单来说就是指先选择一个基准元素(默认第一个是基准元素),再去找到比基准元素大的元素,放在基准元素的右边,比基准元素小的放在基准元素的左边,再将找到的最后一个比基准元素小的元素与基准元素进行交换动画演示的网址https://visualgo.net/en/sorting......