居然在不伤元气的情况下写出了基数排序-)

基数排序就不多说了,其思路如下:

0. 输入为n个整数,每个数字为b位

1. 把整数拆分为b/r“位”, 每个"位"的长度为r(十进制长度)

2. 由低到高分别对每个“位”作计数排序

值得一说的是,为使算法效率最高,r应该为lgn(取整),然而实现中没有限定r的大小,可以自行设定。

不多说,上代码:(RadixSort.h省略)

1. RadixSort.cpp

#include "stdafx.h"
#include <malloc.h>
#include <math.h>

void RadixSort(int a[], int length, int digit, int minBit)
{
    //int r = log2((double)length);
    int r = minBit;
    int range = pow(10.0, r);
    int* bucket = (int*)malloc(range * sizeof(int));
    int* count = (int*)malloc(range * sizeof(int));
    for (int i = r - 1; i < digit; i += r)
    {
        int modNum = pow(10.0, i + 1);
        int lastModNum = pow(10.0, i + 1 - r);
        for (int j = 0; j < range; j++)
        {
            count[j] = 0;
            bucket[j] = 0;
        }
        for (int k = 0; k < length; k++)
        {
            if (i - r < 0)
            {
                count[a[k] % modNum]++;
            }
            else
            {
                int temp = (a[k] % modNum - a[k] % lastModNum) / lastModNum;
                count[temp]++;
            }

        }
        for (int j = 1; j < range; j++)
        {
            count[j] += count[j - 1];
        }
        for (int k = length - 1; k >= 0; k--)
        {
            if (i - r < 0)
            {
                bucket[count[a[k] % modNum] - 1] = a[k];
                count[a[k] % modNum]--;
            }
            else
            {
                int temp = (a[k] % modNum - a[k] % lastModNum) / lastModNum;
                bucket[count[temp] - 1] = a[k];
                count[temp]--;
            }
        }
        for (int k = 0; k < length; k++)
        {
            a[k] = bucket[k];
        }
        printf("round %d\n", i);
        for (int i = 0; i < length; i++)
        {
            printf("%d\t", a[i]);
        }
        printf("\n");

    }
}

2. Main.cpp

// Main.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "RadixSort.h"

int _tmain(int argc, _TCHAR* argv[])
{
    int a[] = { 4343, 1212, 5353, 4141, 8080, 303, 9999 };
    int length = sizeof(a) / sizeof(int);
    RadixSort(a, length, 4, 1);
    return 0;
}

虽然算法还是渣水平,还是要靠单步debug修正代码,还是对0/1的下标犯迷糊,不过能写出这样的代码,比起以前的自己来说是一个巨大的胜利!

时间: 2024-10-21 08:02:14

居然在不伤元气的情况下写出了基数排序-)的相关文章

session过期情况下弹出窗口显示2个登陆页面的问题处理

根据多年的web开发经验,一般当session过期之后,当用户点击任何一个按钮之类的,都是自动跳转到登陆页面,这个在网上有很多过滤器,拦截器实现. 那么在使用类似jquery easy ui的时候,如果页面有一些弹出窗口,是在弹出了窗口再去加载地址拉数据出来的,就会出现父页面跳到登陆页面,弹出页面也跳到登陆页面. 如何解决这个问题呢,我的办法如下: 首先,在过滤器中如果是session过期的话,自动跳到登陆页面,并且带上一个固定参数,在页面index.jsp中获取这个参数,如果存在. 其实就是在

迁移/home目录至新硬盘分区总结--无备份情况下

搞了一天,终于成功迁移.由于一开始就没备份过程实在很曲折. 希望本篇对那些没有备份习惯的朋友们有所帮助. 准备工作: sudo vim /etc/fstab 在文件中加入: /dev/sdb8       /home            ext4    user,rw 0       2 这里其实有问题的,后面会提到 一个新的linux分区,这里我的新分区是sdb8,个人不尽相同.我用的是ext4格式,注意要新的,不要有坏块,最好重新格式化下.我就是因为没格式化,吃过亏,logo界面就提示挂载

尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题。

从10G开始,Oracle提供了一个较为轻量级的客户包,叫做Instant Client. 将它安装好后,就不用再安装庞大的Oracle Client了. 这样一来,只要客户端下载Instant Client,直接解压,设置Path就ok了.具体设置如下:1.下载32位Oracle InstantClient 2.将Oracle InstantClient解压到某目录 3.打开PL/SQL,在perference里面设置OCI Library和Oracle_home,例子如下:        

一点点巧合,使得我再也没有机会说出覆水难收的难听话(在不得已的情况下,也是一个好办法)

在心死了以后,再也没有找过对方.跟她说过一句话.靠着这种巧合,我竟然没有机会对她说一句难听话(会显得我非常没素质,只会加深对方对我的不良判断).而且在最后一次聊天的时候,我居然还有隐隐约约有祝福对方的几句话.对方是非常心地善良之人,如此巧合的示弱,只能让对方感觉是欠我的,而不是我欠对方的.欠不欠倒也不重要,只是在当时那种情况下,很容易会一不小心就会说出覆水难收的非常难听的话,甚至还有可能做出无法收场的事情来,如果那样的话,实在是太糟了.时间过去了整整16年,至今我还是在庆幸因为这个巧合,而没有做

写在315前夕:苹果售后福州直信创邺在没有三包的情况下帮小偷翻新、助力小偷换机销赃!无视王法。让人震惊,痛心,憎恨!消费者很受伤很无奈

投诉公司: 北京直信创邺数码科技有限公司 标题: 写在315前夕:苹果售后在没有三包的情况下帮小偷翻新.助力小偷换机销赃!无视王法.让人震惊,痛心,憎恨!消费者很受伤很无奈 期望: 还我手机,或者赔偿手机:其次曝光送修人姓名联系电话:请苹果,警察,还有苹果售后协助铲除这个黑色产业链.一定要彻查到底 我的手机是2月25日被盗,当时就报警了.27日有带好三包凭证去派出所报案.期间还拨打苹果售后400电话进行被盗登记. 这个是25日晚上在官网查询到的信息,当时还没有被刷机换机. 以下是购机证明: --

python3 在文件确实存在的情况下,运行提示找不到文件

提示 [Errno 2] No such file or directory: 但是路径下确实存在此文件,在不改动的情况下,再次运行,执行成功. 百思不得其解,看到此链接下的回答 http://bbs.csdn.net/topics/391934998?page=1 尝试使用 os.path.normpath() 替换os.path.join(),先记录待测试.

MySQL分页优化中的“INNER JOIN方式优化分页算法”到底在什么情况下会生效?

本文出处:http://www.cnblogs.com/wy123/p/7003157.html 最近无意间看到一个MySQL分页优化的测试案例,并没有非常具体地说明测试场景的情况下,给出了一种经典的方案,因为现实中很多情况都不是固定不变的,能总结出来通用性的做法或者说是规律,是要考虑非常多的场景的,同时,面对能够达到优化的方式要追究其原因,同样的做法,换了个场景,达不到优化效果的,还要追究其原因.个人对此场景在不用情况表示怀疑,然后自己测试了一把,果然发现一些问题,同时也证实了一些预期的想法.

MYSQL 索引类型、什么情况下用不上索引、什么情况下不推荐使用索引

mysql explain的使用: http://blog.csdn.net/kaka1121/article/details/53394426 索引类型 在数据库表中,对字段建立索引可以大大提高查询速度.假如我们创建了一个 mytable表 代码如下: CREATE TABLE mytable(   ID INT NOT NULL,    username VARCHAR(16) NOT NULL  ); 我们随机向里面插入了10000条记录,其中有一条:5555, admin. 在查找use

如何在主机自动IP而虚拟机静态IP的情况下相互ping通?

这两天在学习Linux,用xshell时,发现主机和虚拟机均不能相互ping通.自己查了一下主机是自动获取IP,而虚拟机是静态IP(默认静态).并且,虚拟机选用的是桥接方式.折腾了一会儿终于ping通了. 环境: 主机OS: win10 网络: 有线 虚拟机:VMware12.5.0 OS: RHEL 5.8 注: 一般情况下,主机默认为自动获取IP,VMware桥接情况下默认为静态IP. 步骤: (1) 给虚拟机Network Adapter设置Bridge方式,前提是虚拟机在关机情况下. 然