基数排序-LSD
这个最低位优先的基数排序,非常适合移植到硬件设备中,所以,我们提供一个C源码
——————————————————————————————————————
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define maxSize 100
#define maxValue 20000
typedef struct
{
int data;
int link;
}SLNode;
typedef struct
{
SLNode elem[maxSize];
int n;
}StaticLinkList;
void createSList(StaticLinkList *SL, int arr[], int n)
{
for (int i=0; i<n; i++)
{
SL->elem[i+1].data = arr[i];
SL->elem[i+1].link = i+2;
}
SL->elem[0].data = maxValue;
SL->elem[0].link = 1;
SL->elem[n].link = 0;
SL->n = n;
}
#define rd 10
#define d 3
int getDigit(int x, int k)
{
if (k<1||k>d)
{
return -1;
}
for(int i=1; i<=d-k; i++)
{
x /= 10;
}
return x%10;
}
void SLinkRadixSort(StaticLinkList * SL)
{
int front[rd], rear[rd];
int i, j, k, last, s, t;
for (i=d; i>=1; i--)
{
for (j=0; j<rd; j++)
{
front[j] = 0;
}
for (s=SL->elem[0].link; s!=0; s=SL->elem[s].link)
{
k = getDigit(SL->elem[s].data, i);
if (0==front[k])
{
front[k] = s;
}
else
{
SL->elem[rear[k]].link = s;
}
rear[k] = s;
}
for (j=0; j<rd&&0==front[j]; j++);
SL->elem[0].link = front[j];
last = rear[j];
for (t=j+1; t<rd; t++)
{
if (0!=front[t])
{
SL->elem[last].link = front[t];
last = rear[t];
}
}
SL->elem[last].link = 0;
}
}
void main()
{
int arr[] = {332, 633, 589, 232, 664, 179, 457, 825, 405, 361};
int len = sizeof(arr)/sizeof(int);
StaticLinkList SL;
createSList(&SL, arr, len);
SLinkRadixSort(&SL);
for (int i=SL.elem[0].link; 0!=i; i = SL.elem[i].link)
{
printf("%d ", SL.elem[i].data);
}
printf("\n");
}
//result
# ./sort
179 232 332 361 405 457 589 633 664 825
基数排序-LSD的更多相关文章
- 十大经典排序算法总结(JavaScript描述)
前言 读者自行尝试可以想看源码戳这,博主在github建了个库,读者可以Clone下来本地尝试.此博文配合源码体验更棒哦~~~ 个人博客:Damonare的个人博客 原文地址:十大经典算法总结 这世界 ...
- 十大经典排序算法的JS版
前言 个人博客:Damonare的个人博客 如遇到问题或有更好的优化方法,可以: 提issue给我 或是pull requests 我都会看到并处理,欢迎Star. 这世界上总存在着那么一些看似相似但 ...
- 排序算法总结(C语言版)
排序算法总结(C语言版) 1. 插入排序 1.1 直接插入排序 1.2 Shell排序 2. 交换排序 2.1 冒泡排序 2.2 快速排序 3. 选择 ...
- JavaScript十大经典排序算法
排序算法说明 (1)排序的定义:对一序列对象根据某个关键字进行排序: 输入:n个数:a1,a2,a3,…,an输出:n个数的排列:a1’,a2’,a3’,…,an’,使得a1’ 再讲的形象点就是排排坐 ...
- 浅析十大常见排序(含C++代码)
首先声明一下,本文只对十种排序算法做简单总结,并参照一些资料给出自己的代码实现,并没有对某种算法理论讲解,更详细的 了解可以参考以下资料: 1.<data structure and algor ...
- 十大经典排序算法(Javascript实现)
前言 总括: 本文结合动图详细讲述了十大经典排序算法用Javascript实现的过程. 原文博客地址:十大经典排序算法 公众号:「菜鸟学前端」,回复「666」,获取一揽子前端技术书籍 人生有情泪沾衣, ...
- 基本排序算法——基数排序java实现
基数排序 package basic.sort; import java.util.Arrays; import java.util.Random; public class RadixSort { ...
- 基数排序 java 实现
基数排序 java 实现 Wikipedia: Radix sort geeksforgeeks: Radix sort 数学之美番外篇:快排为什么那样快 Java排序算法总结(八):基数排序 排序八 ...
- 基数排序详解以及java实现
前言 基数排序(radix sort)又称桶排序(bucket sort),相对于常见的比较排序,基数排序是一种分配式排序,即通过将所有数字分配到应在的位置最后再覆盖到原数组完成排序的过程.我在上一篇 ...
随机推荐
- SQL允许脏读WITH(NOLOCK)
使用WIHT(NOLOCK)有利也有弊,所以在决定使用之前,你一定需要了解清楚WITH(NOLOCK)的功能和缺陷,看其是否适合你的业务需求,不要觉得它能提升性能,稀里糊涂的就使用它. --事务未提交 ...
- Swift 使用 日常笔记
//------------------- var totalPrice: Int = { willSet(newTotalPrice) { //参数使用new+变量名且变量名首地址大写 printl ...
- [SignalR2] 认证和授权
SignalR自身不提供任何用户认证特征,相反,是直接使用现有且基于(Claims-based)声明认证系统(关于这方面知识详见参考资料),非常明了,不解释,看代码中的验证代码: protected ...
- 一些值得深入学习和借鉴的 .Net 开源项目
1.DotNetFramework .NET Reference Source 发布了 beta 版,可以在线浏览 .NET Framework 4.5.1 的源代码,并且可以通过配置,在 Visu ...
- 读文件/写文件。http请求。读取文件列表。
package transfor; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import j ...
- 课堂小记---JavaScript(1)
day01 1.数据类型 number string boolean undefined object function 加号具有两种功能,数字相加 和 字符串拼接.加号两边只要碰见字符串,则执行字 ...
- Codeforces 1045E. Ancient civilizations 构造 计算几何 凸包
原文链接https://www.cnblogs.com/zhouzhendong/p/CF1045E.html 4K码量构造题,CF血腥残暴! 题解 首先,如果所有点颜色相同,那么直接连个菊花搞定. ...
- 20165220 mybash
使用fork,exec,wait实现mybash - 写出伪代码,产品代码和测试代码 - 发表知识理解,实现过程和问题解决的博客(包含代码托管链接) 1.fork 功能:创建一个新的进程 一个现存进程 ...
- Selenium2+python自动化45-18种定位方法(find_elements)
前言 江湖传言,武林中流传八种定位,其中xpath是宝刀屠龙,css是倚天剑. 除了这八种,其实还有十种定位方法,眼看就快失传了,今天小编让失传已久的定位方法重出江湖! 一.十八种定位方法 前八种是大 ...
- 用Margin还是用Padding?(转载)
转载出自 海玉的博客 本文地址: http://www.hicss.net/use-margin-or-padding/ 用margin还是用padding这个问题是每个学习CSS进阶时的必经之路. ...