oj 2758: C++习题-基数排序

本文介绍了基数排序的基本思想和工作原理,这是一种线性时间复杂度的分配排序算法。通过示例详细解释了如何进行基数排序,并提供了一个C++实现的代码示例。在代码中,展示了如何逐位进行排序,最终得到有序序列。
摘要由CSDN通过智能技术生成

问题:

 

Description

基数排序是一种分配排序,其基本思想是:排序过程无须比较关键字,而是通过“分配”和“收集”过程来实现排序。它们的时间复杂度可达到线性O(n)。基数排序所做的事情,是对N位分别进行排序。从直觉上来看,人们可能会觉得应该首先按最高有效位进行排序,不过这点与我们的直觉相反,基数排序首先对最低有效位数字进行排序。如果我们每次比较r bits,则需要进行b/r趟,每趟进行计数排序需要O(n+2^r),则总的时间复杂度为O(b/r(n+2^r))。

理论上来说,基数排序的速度是几种排序方法中最快的,可以达到O(N),而其它的排序算法最快也只有O(N*logN)。但是,基数排序需要占用额外的空间,而且只支持整数进行排序。

#include <iostream>
#include <string.h>
using namespace std;
/* 获取输入数字的索引值,order指定需要获取哪一位的索引,1代表个位,2代表十位,3代表百位 */
int get_index(int num, int order)
{
    while(--order)
        num/=10;
    return num%10;
}
/* 进行基数排序 */
void radix_sort(int arr[], int len, int dec, int order)
{
    int i, j;
    int index;                      /* 排序索引 */
    int tmp[1001];                  /* 临时数组,用来保存待排序的中间结果 */
    int num[10];                    /* 保存索引值的数组 */
    memset(num, 0, 10*sizeof(int)); /* 数组初始清零 */
    memset(tmp, 0, len*sizeof(int));/* 数组初始清零 */
    if (dec < order)                /* 最高位排序完成后返回 */
        return;
    for (i=0; i<len

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值