排序算法----基数排序(RadixSort(L,max))单链表版本
转载http://blog.csdn.net/Shayabean_/article/details/44885917博客
先说说基数排序的思想:
基数排序是非比较型的排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。
将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。在每一次排序中,按照当前位把数组元素放到对应
的桶当中,然后把桶0到桶9中的元素按先进先出的方式放回数组中。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。

这个版本的基数排序RadixSort(L,max)较RadixSort(L)不同的是需要输入待排序列最大数的位数。因为RadixSort(L)最大数位在程序中已经计算过了,因为需要计算最大数,所以需要对待排链表最开始循环一次,所以RadixSort(L,max)速度比RadixSort(L)稍快。
这篇博客包括4个文件,两个头文件RadixSort.h和fatal.h,一个库函数RadixSort.c,和一个测试文件Test_Radix_Sort.c
头文件fatal.h:
#include<stdio.h>
#include<stdlib.h>
#define Error(Str) FatalError(Str)
#define FatalError(Str) fprintf(stderr, "%s\n", Str), exit(1);
头文件RadixSort.h:
typedef int ElementType;
#ifndef RADIX_SORT_H
#define RADIX_SORT_H #include<stdbool.h>
#define ListEmpty -2 struct Node;
typedef struct Node *PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position; List MakeEmpty(List L);
bool IsEmpty(List L);
bool IsLast(Position P, List L);
Position Header(List L);
Position Advance(Position P);
ElementType Retrieve(Position P);
void DeleteList(List L);
void PrintList(const List L);
void Insert(ElementType X, List L, Position P);
void MoveNode(List L1, List L2);//将表L2中的头节点移动成为L1的尾节点
void RadixSort(List L,int max);//最终基数排序函数,输入链表L,将L排序得到新的排序链表L,其中max是待排元素最高有多少位
#endif // !RADIX_SORT_H
其中RadixSort是最终排序函数,调用它即可排序。
库函数RadixSort.c
#include "RadixSort.h"
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<math.h>
#include"fatal.h"
struct Node
{
ElementType Element;
Position Next;
}; //初始化链表
List MakeEmpty(List L)
{
if (L != NULL)
DeleteList(L);//如果链表非空,则删除链表
L = malloc(sizeof(struct Node));
if (L == NULL)
FatalError("Out of memory!");
L->Next = NULL;
return L;
}
//判断链表是否为空
bool IsEmpty(List L)
{
return L->Next == NULL;
} //判断当前指针P是否指向链表最后一个元素
bool IsLast(Position P, List L)
{
return P->Next == NULL;
} //获取链表头
Position Header(List L)
{
return L;
} //获取位置P的下一个位置
Position Advance(Position P)
{
return P->Next;
} //提取位置P处结构里面的值
ElementType Retrieve(Position P)
{
return P->Element;
} //删除链表
void DeleteList(List L)
{
Position P, Temp;
P = L->Next;
L->Next = NULL;
while (P != NULL)
{
Temp = P->Next;
free(P);
P = Temp;
}
} //打印链表
void PrintList(const List L)
{
Position P = Header(L);
if (IsEmpty(L))
printf("Empty list\n");
else
{
do
{
P = Advance(P);
printf("%d ", Retrieve(P));
} while (!IsLast(P, L));
printf("\n");
}
} //插入元素X到位置P后面
void Insert(ElementType X, List L, Position P)
{
Position TmpCell;
TmpCell = malloc(sizeof(struct Node));
if (TmpCell == NULL)
FatalError("Out of Space!!!");
TmpCell->Element = X;
TmpCell->Next = P->Next;
P->Next = TmpCell;
} void MoveNode(List L1, List L2)
{
//将表L2中的头节点移动成为L1的尾节点
Position Tmp1 = L1;
Position Tmp2;
if (IsEmpty(L2)) exit(ListEmpty);
while (!IsLast(Tmp1,L1))
Tmp1 = Tmp1->Next;//使Tmp1指向L1表尾
Tmp2 = L2->Next;
L2->Next = Tmp2->Next;
Tmp1->Next = Tmp2;
Tmp2->Next = NULL;
} void RadixSort(List L,int max)
{
//if (IsEmpty(L)) return L; //如果要排序的链表L是空表,则不排序
int i,j, TmpSub;//Tmpsub存储数的个位、十位、百位
ElementType FirstElement;//存储链表的第一个元素 List Bucket[];//开辟10个桶,依次为0~9
for (i = ; i < ; i++) Bucket[i] = MakeEmpty(NULL);//对10桶进行初始化,每一个数组都是一个链表
for (i = ; i < max; i++)//开始提取每一位数的个位、十位、百位
{
while (!IsEmpty(L))//当L中的元素被取光了,则循环结束
{
FirstElement = L->Next->Element;//取出第一个节点的数据
TmpSub = (int)(FirstElement / pow(, i)) % ;//依次取出个十百位数字
MoveNode(Bucket[TmpSub], L);//将L中的节点依次移到对应的桶中
}
for (j = ; j < ; j++) //将桶中的数再次移动到L中
{
while (!IsEmpty(Bucket[j])) MoveNode(L, Bucket[j]);
}
}
for (i = ; i < ; i++) free(Bucket[i]) ;//释放掉10个桶
}
测试函数Test_Radix_Sort.c
#include<stdio.h>
#include "RadixSort.h"
#include"fatal.h"
#include<time.h> int main()
{
int amount;
List L; Position P;
L = MakeEmpty(NULL);//初始化链表
P = L;
if (L == NULL) Error("Out of Space!!!");
printf("随机生成多少位数:");
scanf_s("%d", &amount);
srand((unsigned)time(NULL));
for (int i = ; i < amount; i++)
{
Insert(rand() % , L, P);
P = Advance(P);
}
printf("排序前的结果:");
PrintList(L);
RadixSort(L,);//调用排序函数排序
printf("基数排序后的结果:");
PrintList(L);
}

排序算法----基数排序(RadixSort(L,max))单链表版本的更多相关文章
- 经典排序算法 - 基数排序Radix sort
经典排序算法 - 基数排序Radix sort 原理类似桶排序,这里总是须要10个桶,多次使用 首先以个位数的值进行装桶,即个位数为1则放入1号桶,为9则放入9号桶,临时忽视十位数 比如 待排序数组[ ...
- 学习排序算法(一):单文档方法 Pointwise
学习排序算法(一):单文档方法 Pointwise 1. 基本思想 这样的方法主要是将搜索结果的文档变为特征向量,然后将排序问题转化成了机器学习中的常规的分类问题,并且是个多类分类问题. 2. 方法流 ...
- 使用 js 实现十大排序算法: 基数排序
使用 js 实现十大排序算法: 基数排序 基数排序 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!
- 排序算法----基数排序(RadixSort(L))单链表智能版本
转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...
- 已知单链表的数据元素为整型数且递增有序,L为单链表的哨兵指针。编写算法将表中值大于X小于Y的所有结点的顺序逆置。(C语言)
对此题目的完整示例可直接运行代码如下: #include <stdio.h> #include <stdlib.h> typedef struct LNode{ int dat ...
- 基本排序算法——基数排序java实现
基数排序 package basic.sort; import java.util.Arrays; import java.util.Random; public class RadixSort { ...
- 八大排序算法——基数排序(动图演示 思路分析 实例代码java 复杂度分析)
一.动图演 二.思路分析 基数排序第i趟将待排数组里的每个数的i位数放到tempj(j=1-10)队列中,然后再从这十个队列中取出数据,重新放到原数组里,直到i大于待排数的最大位数. 1.数组里的数最 ...
- 排序算法-基数排序(Java)
package com.rao.sort; import java.util.*; /** * @author Srao * @className RadioSort * @date 2019/12/ ...
- [转] 经典排序算法 - 基数排序Radix sort
原理类似桶排序,这里总是需要10个桶,多次使用 首先以个位数的值进行装桶,即个位数为1则放入1号桶,为9则放入9号桶,暂时忽视十位数 例如 待排序数组[62,14,59,88,16]简单点五个数字 分 ...
随机推荐
- 解析大型.NET ERP系统 高质量.NET代码设计模式
1 缓存 Cache 系统中大量的用到缓存设计模式,对系统登入之后不变的数据进行缓存,不从数据库中直接读取.耗费一些内存,相比从SQL Server中再次读取数据要划算得多.缓存的基本设计模式参考下面 ...
- JavaScript权威设计--命名空间,函数,闭包(简要学习笔记十二)
1.作为命名空间的函数 有时候我们需要声明很多变量.这样的变量会污染全局变量并且可能与别人声明的变量产生冲突. 这时.解决办法是将代码放入一个函数中,然后调用这个函数.这样全局变量就变成了 局部变量. ...
- MySQL升级
MySQL的升级相对来说还是比较简单的. 它支持两种方式的升级: 原地升级(In-place Upgrade) 关闭数据库,替换旧的二进制文件,重启数据库,执行mysql_upgrade 逻辑升级(L ...
- 通过一个实例理解 offsetLeft,offsetTop; offsetWidth , offsetHeight
obj.offsetTop 指 obj 相对于版面或由 offsetParent 属性指定的父坐标的计算上侧位置,整型 obj.offsetLeft 指 obj 相对于版面或由 offsetParen ...
- 一个技术汪的开源梦 —— 基于 .Net Core 的组件 Nuget 包制作 & 发布
一个技术汪的开源梦 —— 目录 微软的 ASP.Net Core 强化了 Nuget 的使用,所有的 .Net Core 组件均有 Nuget 管理,所以有必要探讨一下 .Net Core 组件制作 ...
- 黄聪:如何给wordpress的编辑器添加一个自定义按钮,并且实现插入功能
1.添加按钮 在 functions.php 文件里面添加下面代码: add_action('media_buttons', 'add_my_media_button'); function ad ...
- SSM项目搭建(提供源码)
1创建web动态项目,项目结构截图 2.配置日志文件 #\u5B9A\u4E49LOG\u8F93\u51FA\u7EA7\u522B log4j.rootLogger=INFO,Console,Fi ...
- JavaScript 随机数
JavaScript内置函数random(seed)可以产生[0,1)之间的随机数,若想要生成其它范围的随机数该如何做呢? 生成任意范围的随机数 //生成[100,120)之间的随机数 Math.fl ...
- js数组去重
这就是数组去重了...var str=['hello','node','element','node','hello','blue','red'];var str1=[]; function firs ...
- 使用图片视频展示插件blueimp Gallery改造网站的视频图片展示
在很多情况下,我们网站可能会展示我们的产品图片.以及教程视频等内容,结合一个比较好的图片.视频展示插件,能够使得我们的站点更加方便使用,也更加酷炫,在Github上有很多相关的处理插件可以找来使用,有 ...