基数排序原理

基数排序(以整形为例),将整形10进制按每位拆分,然后从低位到高位依次比较各个位。主要分为两个过程:
(1)分配,先从个位开始,根据位值(0-9)分别放到0~9号桶中(比如53,个位为3,则放入3号桶中)
(2)收集,再将放置在0~9号桶中的数据按顺序放到数组中
基数排序二维数组实现
源代码
/********************************************************
*函数名称:GetNumInPos
*参数说明:num 一个整形数据
*           pos 表示要获得的整形的第pos位数据
*说明:    找到num的从低到高的第pos位的数据
*********************************************************/
int GetNumInPos(int num,int pos)
{int temp = 1,i;for (i = 0; i < pos - 1; i++)temp *= 10;return (num / temp) % 10;
}/********************************************************
*函数名称:RadixSort
*参数说明:pDataArray 无序数组;
*           iDataNum为无序数据个数
*说明:    基数排序
*********************************************************/
#define RADIX_10 10    //整形排序
#define KEYNUM_31 10     //关键字个数,这里为整形位数
void RadixSort(int* pDataArray, int iDataNum)
{int *radixArrays[RADIX_10];  //分别为0~9的序列空间int pos,i,k,j;for (i = 0; i < 10; i++){radixArrays[i] = (int *)malloc(sizeof(int) * (iDataNum + 1));radixArrays[i][0] = 0;    //index为0处记录这组数据的个数
    }for ( pos = 1; pos <= KEYNUM_31; pos++)    //从个位开始到31位
    {for ( i = 0; i < iDataNum; i++)    //分配过程
        {int num = GetNumInPos(pDataArray[i], pos);int index = ++radixArrays[num][0];radixArrays[num][index] = pDataArray[i];}for ( i = 0, j =0; i < RADIX_10; i++)    //收集
        {for (k = 1; k <= radixArrays[i][0]; k++)pDataArray[j++] = radixArrays[i][k];radixArrays[i][0] = 0;    //复位
        }}
}int main(void) {int a[] = {521 ,310 ,72 ,373 ,15, 546 ,385, 856, 187, 147};RadixSort(a,10);int i;for(i = 0;i<10;i++){printf("%d ",a[i]);}return 0;
}

转自:http://blog.csdn.net/cjf_iceking/article/details/7943609

算法理解:建立一个二维数组,第一维度表示桶序列号,第二维度存放每一位分配后的序列 大小为 d*(n+1) d为待排序序列最高位数,d有多少位就对序列n进行循环,一次循环 对一位进行排序,最后得出排序序列

基数排序单链表实现

原理:分配的桶(数组)存放单链表,每一个桶里面单链表的每个节点的内容(除头结点)存放同一个桶里面的元素,next指向下一个元素

实现代码

#ifndef __SINGLY_LINKED_LIST_H__
#define __SINGLY_LINKED_LIST_H__typedef int ElementType;
struct Node;
typedef struct Node* PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position;struct Node
{ElementType Val;Position Next;
};void  CreateList(List*);
void  DeleteList(List);
int  IsEmpty(List);
int  IsLast(Position, List);
Position  Header(List);
Position  First(List);
Position  Advance(Position);
Position  Find(ElementType, List);
ElementType  GetAt(Position);
void  MakeEmpty(List);
void  Delete(ElementType, List);
void  Insert(ElementType, Position, List);
void  InsertFront(ElementType, List);
void  InsertBack(ElementType, List);#endif

#include <stdlib.h>
#include "SinglyLinkedList.h"void  CreateList(List* L)
{PtrToNode pHeader = (struct Node*)malloc(sizeof(struct Node));pHeader->Next = NULL;*L = pHeader;
}void  DeleteList(List L)
{MakeEmpty(L);free(L);
}int  IsEmpty(List L)
{return L->Next == NULL;
}int  IsLast(Position P, List L)
{return P->Next == NULL;
}Position  Header(List L)
{return L;
}Position  First(List L)
{return L->Next;
}Position  Advance(Position P)
{return P->Next;
}Position  Find(ElementType X, List L)
{Position p = L->Next;while(p != NULL && p->Val != X){p = p->Next;}return p;
}ElementType  GetAt(Position P)
{return P->Val;
}void MakeEmpty(List L)
{Position p, tmp;p = L->Next;while(p != NULL){tmp = p->Next;free(p);p = NULL;p = tmp;}L->Next = NULL;
}void  Delete(ElementType X, List L)
{Position p, tmp;p = L;while(p->Next != NULL && p->Next->Val != X){p = p->Next;}if(!IsLast(p, L)){tmp = p->Next;p->Next = tmp->Next;free(tmp);tmp = NULL;// 错误示范://free(p->Next);//p->Next = tmp->Next;
    }
}void  Insert(ElementType X, Position P, List L)
{PtrToNode pNode;pNode = (struct Node*)malloc(sizeof(struct Node));pNode->Val = X;pNode->Next = P->Next;P->Next = pNode;
}void  InsertFront(ElementType X, List L)
{Position pos;PtrToNode pNode;pos = L;pNode = (struct Node*)malloc(sizeof(struct Node));pNode->Val = X;pNode->Next = pos->Next;pos->Next = pNode;
}void  InsertBack(ElementType X, List L)
{Position pos;PtrToNode pNode;// move to tailpos = L;while(pos->Next != NULL)    pos = pos->Next;pNode = (struct Node*)malloc(sizeof(struct Node));pNode->Val = X;pNode->Next = pos->Next;pos->Next = pNode;
}
#include <stdio.h>
#include <stdlib.h>
#include "SinglyLinkedList.h"#define N 10    // 排序的数个数
#define B 10    // 桶数,即基数
#define P 3        // 位数void RadixSort(int arr[]);
int GetDigit(int x, int y);
void PrintArray(int arr[], int size);int main()
{int i;//int arr[N];int arr[N] = {64, 8, 216, 512, 27, 729, 0, 1, 343, 125};    // 10, 3//int arr[N] = {64, 8, 216, 512, 125, 729, 0, 729, 343, 125};//int arr[N] = {12, 58, 37, 64, 52, 36, 99, 63, 18, 9, 20, 88, 47}; // 13, 2
printf("before sort: ");PrintArray(arr, N);RadixSort(arr);printf("after sort: ");PrintArray(arr, N);system("PAUSE");return 0;
}void RadixSort(int arr[])
{int i, j, k, digit;Position pos;List bucket[B];// 创建桶for(i=0; i<B; ++i)    CreateList(&bucket[i]);// 从低位到高位循环每一位数字for(i=0; i<P; ++i){// 将桶置空for(j=0; j<B; ++j)    MakeEmpty(bucket[j]);// 根据当前位上的数字,将之放入对应桶中。并注意顺序(后进的放在后面)for(j=0; j<N; ++j){digit = GetDigit(arr[j], i);InsertBack(arr[j], bucket[digit]);}k = 0;// 将每趟排序后的结果存回arrfor(j=0; j<B; ++j){pos = First(bucket[j]);while(pos != NULL){arr[k++] = pos->Val;pos = pos->Next;}}}for(i=0; i<B; ++i)    DeleteList(bucket[i]);
}// 取整数x的倒数第y位数字,y从0开始
int GetDigit(int x, int y)
{int i, t = 1;for(i=0; i<=y; ++i)    t *= 10;return (x % t) / (t / 10);
}void PrintArray(int arr[], int size)
{int i;for(i=0; i<size; ++i){printf("%d ", arr[i]);}printf("\n");
}

数组实现和链表实现的优缺点:数组浪费空间,链表按需生成空间。

转载于:https://www.cnblogs.com/loongqiang/p/3817672.html

十大排序方法之基数排序相关推荐

  1. 【基数排序】十大排序算法之基数排序

    [基数排序]十大排序算法之基数排序,是属于[稳定]的排序. 目录 一.基数排序基本思想 二.基数排序代码实现 2.1.二维数组实现 2.2.链表实现

  2. #转载:十大排序方法,动图展示

    一像素 </div><div id="navigator"> 博客园 首页 新随笔 联系 订阅 管理 <div class="blogSta ...

  3. 经典十大排序算法(含升序降序,基数排序含负数排序)【Java版完整代码】【建议收藏系列】

    经典十大排序算法[Java版完整代码] 写在前面的话 十大排序算法对比 冒泡排序 快速排序 直接选择排序 堆排序 归并排序 插入排序 希尔排序 计数排序 桶排序 基数排序 完整测试类 写在前面的话   ...

  4. 十大排序算法之快速排序(两种方法)

    十大排序算法之快速排序 本文采用Java书写选择排序,其他语言类似可以借鉴着写 思想:在待排序序列中选择一个分割元素,将待排序序列中所有比分割元素关键字小的元素移动到分割元素左侧位置:将待排序序列中所 ...

  5. 这或许是东半球分析十大排序算法最好的一篇文章

    作者 | 不该相遇在秋天 转载自五分钟学算法(ID:CXYxiaowu) 前言 本文全长 14237 字,配有 70 张图片和动画,和你一起一步步看懂排序算法的运行过程. 预计阅读时间 47 分钟,强 ...

  6. 「干货总结」程序员必知必会的十大排序算法

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 绪论 身 ...

  7. 「归纳|总结」程序员必知必会的十大排序算法

    微信搜一搜「bigsai」关注这个有趣的程序员 新人原创公众号,求支持一下!你的点赞三连肯定对我至关重要! 文章已收录在 我的Github bigsai-algorithm 欢迎star 本文目录 绪 ...

  8. 归并排序执行次数_十大排序算法,看这篇就够了

    排序算法分类[1][2] 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序. 非比较类排序:不通过比较来决定元素间的相对次序,它可以 ...

  9. C 数据结构之十大排序

    C 数据结构之十大排序 排序算法是<数据结构与算法>中最基本的算法之一. 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳 ...

  10. 十大排序算法(Java)

    文章目录 十大排序算法(Java) 一.冒泡排序(Bubble Sort) 二.选择排序(Selection Sort) 三.堆排序(Heap Sort) 四.插入排序(Insertion Sort) ...

最新文章

  1. 桌面显示菜单图标下面的字搞起阴影了,怎么弄掉?
  2. .mb是什么文件_神经网络长什么样不知道? 这有一份简单的 pytorch可视化技巧(1)
  3. Visual Studio 2008 安装失败(“Web 创作组件”无法安装)解决方法
  4. lisp 设计盘形齿轮铣刀_用AutoLISP程序设计盘形齿轮铣刀渐开线齿形
  5. 自定义轮播图以及bug优化
  6. powerdesigner总结
  7. 【编译工具系列】之GCC文件关联
  8. 11.05T3 map
  9. Linux防火墙(iptables)的开启与关闭
  10. 一步步教你如何配置Java环境变量(超级详细)
  11. 数据库小白 T-SQL练习500题 超详细!带素材!持续更新中~
  12. 2020年计算机保研经验总结
  13. 微软语音合成助手 v1.5.1 文本转语音工具,真实语音AI生成器
  14. 如何卸载office201032位_32位office2010卸载不彻底怎么办
  15. 将靠父id的层级关系处理成编码形式
  16. JPA Specification 自定义查询
  17. micro usb接口正负极_关于手机MicroUSB接口数据线,这里有最详细解说
  18. springboot 发送短信
  19. 微信小程序 实现点击卡片 翻转效果
  20. 用多媒体计算机画图教学设计,Windows98中画图程序的使用教学设计.doc

热门文章

  1. Navicat 设置自动插入时间触发器
  2. scikit 线性回归_使用scikit学习线性回归学习和体育运动nba数据数据科学
  3. 2022 CCF中国软件大会(CCF Chinasoft)“软件可信性与供应链安全前沿进展”论坛成功召开...
  4. laravel-admin模型表格和详情展示关联数据
  5. 一生必看的经典电影(转载)
  6. 【信号与系统】指数信号与正弦信号
  7. 跟我一起学Linux系统编程006C-进程内存分配,堆分配brk、malloc、free
  8. python实训报告怎么写_python实验报告
  9. 拿走不谢,最全匹配中国大陆手机号码的正则表达式
  10. 《创造成功本能》 博客思听 2011年2月