【0】README

1)本文旨在 给出 ReviewForJob——桶式排序+基数排序(==多次桶式排序) 的 代码实现和代码分析;

2)桶式排序基础参见 http://blog.csdn.net/pacosonswjtu/article/details/49685749, 基数排序基础参见  http://blog.csdn.net/pacosonswjtu/article/details/49687193

【1】桶式排序

1)intro:桶式排序适用于 许多输入只是一些小的整数的case, 而这种输入数据是 小整数的case 下 使用 快速排序就小题大做了;(小整数,比如所有数据小于10)

2)输入数据: 输入数据 A1, A2, A3, ........,An 必须只由小于 M 的整数组成;因为桶只有 M 个,M 个 桶存储在数组中;如对10进制数字而言,桶取10;纸牌数字而言,桶取13;纸牌花色而言,桶取4;(你看到了,生活中,小整数本就直接或间接存在的)

3)桶式排序如何存储数据的? value == index(把value看做其存储在数组中的下标)(干货——桶式排序的核心),即 array[Ai] = Ai,如 array[1] = 1,对的,你没有看错,数字1 就存储在 下标为1的桶中,或以下标为1的链表中(链式存储);如果有多个1的话,就存储在 其 next 节点中;这样一来,头结点存储在数组下标为1的 链表 存储着输入的所有数字1;

4)源码实现如下:

#include <stdio.h>
#include <malloc.h>#define ElementType int
#define Error(str) printf("\n\t error: %s \n",str) struct Node;
typedef struct Node *Node;struct Node
{int value;Node next;
};struct BucketSet;
typedef struct BucketSet* BucketSet;struct BucketSet
{int size;Node* array;
};BucketSet initBucketSet();
void printArray(ElementType* data, int size);
Node createNode(int value);
void bucketsort(Node* buckets, ElementType value);// allocate for new Node with value.
Node createNode(int value)
{Node temp = (Node)malloc(sizeof(struct Node));if(temp==NULL){Error("failed createBucket() for out of space.");return NULL;}temp->next = NULL;temp->value = value;return temp;
}// allocate the memory for the bucket and bucket ptr
BucketSet initBucketSet(int size)
{BucketSet bucketSet;   int i;// allocate memory for BucketSet.bucketSet = (BucketSet)malloc(sizeof(struct BucketSet));if(bucketSet==NULL){Error("failed initBucketSet() for out of space.");return NULL;  }bucketSet->size = size;// allocate memory for BucketSet->buckets.bucketSet->array = (Node*)malloc(size * sizeof(Node));if(!bucketSet->array){Error("failed initBucketSet() for out of space.");return NULL;    }   // allocate memory for every unit in BucketSet->buckets.for(i=0; i<size; i++){bucketSet->array[i] = createNode(-1);if(bucketSet->array[i]==NULL){         Error("failed initBucketSet() for out of space.");return NULL;}       }return bucketSet;
}// details of bucketSort for the input array data with size
void bucketsort(Node* buckets, ElementType value)
{           Node temp = buckets[value]; // value is treated as index.while(temp->next){temp = temp->next;}temp->next = createNode(value);temp->next->value = value;
}
// 将桶中数据 copy 回 原来的数组中.
void bucketsToArray(BucketSet bucketSet, ElementType* array)
{Node* buckets = bucketSet->array;Node temp;int size = bucketSet->size;int i, j=0;for(i=0; i<size; i++){temp = buckets[i];while(temp->next){         array[j++] = temp->next->value;temp = temp->next;}}
}void printArray(ElementType* data, int size)
{int i;for(i = 0; i < size; i++)   printf("\n\t data[%d] = %d", i, data[i]);                    printf("\n\n");
} 
#include "p189_bucket_sort.h"void main()
{   BucketSet bucketSet;ElementType data[] = {9, 6, 3, 2, 7, 7, 1, 4, 1, 0, 3, 9, 1, 1};   int size = 14, capacity=10;int i;bucketSet = initBucketSet(capacity);if(bucketSet==NULL){return ;}  printf("\nbucketsort based on {9, 6, 3, 2, 7, 7, 1, 4, 1, 0, 3, 9, 1, 1}\n");    // 对10以内的数字进行桶排序.for(i=0; i<size; i++){bucketsort(bucketSet->array, data[i]);  }   bucketsToArray(bucketSet, data);printArray(data, size);
} 

对以上代码的分析(Analysis):void bucketsort(Node* buckets, ElementType value) :桶排序的函数声明 必须这样写,因为main 函数中通过循环传入输入数据就可以调用了,这也方便了 后续 基数排序的扩展,即 不要把 main函数中的循环 放入 bucketsort() 函数中去;

【2】基数排序

1)intro:基数排序等价于多次桶式排序;

2)基数排序中的桶式排序代码和 单纯的桶式排序代码有一点不一样:下面的代码可以看到, 基数排序中的桶式排序方法 一开始就要 计算 输入数据在某位上的数字,该数字作为 index 而不是整个 value 作为 index, 这和 单纯的桶式排序有点区别;

// get the integer under the bit.
int singleBit(int value, int bit)
{int i=1;while(i++ < bit){value /= 10;}return value%10;
}// details of bucketsort for input data.
void bucketsort(Node* buckets, ElementType value, int bit) // 基数排序中的桶式排序代码
{           int index = singleBit(value, bit);Node temp = buckets[index]; // value is treated as direct or indirect index.while(temp->next){temp = temp->next;}temp->next = createNode(value);
}
// details of bucketSort for the input array data with size
void bucketsort(Node* buckets, ElementType value) // 单纯的桶式排序代码
{           Node temp = buckets[value]; // value is treated as index.while(temp->next){temp = temp->next;}temp->next = createNode(value);temp->next->value = value;
}

3)基数排序代码如下:

// get the integer under the bit.
int singleBit(int value, int bit)
{int i=1;while(i++ < bit){value /= 10;}return value%10;
}// details of bucketsort for input data.
void bucketsort(Node* buckets, ElementType value, int bit)
{           int index = singleBit(value, bit);Node temp = buckets[index]; // value is treated as direct or indirect index.while(temp->next){temp = temp->next;}temp->next = createNode(value);
}
#include "p189_bucket_sort.h"//free the memory bucketSet->array own.
void clearBuckets(BucketSet bucketSet)
{int i, size = bucketSet->size;Node* array = bucketSet->array;Node temp, tempcopy;for(i=0; i<size; i++){temp = array[i]->next;while(temp){tempcopy = temp;temp = temp->next;free(tempcopy);tempcopy = NULL;         }array[i]->next = NULL;}
}// 基于桶式排序的基数排序. (待排序元素个数为size)
void radixsort(ElementType* array, int size)
{BucketSet bucketSet;   int capacity=10; // 桶的设置为 10.int i, j;bucketSet = initBucketSet(capacity);if(bucketSet==NULL){return ;}  for(i=1; i<=3; i++){for(j=0; j<size; j++){bucketsort(bucketSet->array, array[j], i);}bucketsToArray(bucketSet, array); // 别忘记将桶中数据copy 回数组.printArray(array, size);    clearBuckets(bucketSet); // 每轮都要清理 数组式链表.}
}
void main()
{        ElementType array[] = {110, 245, 895, 658, 321, 852, 147, 458, 469, 159, 347, 28};    int size=12;printf("\n radix sort based on {110, 245, 895, 658, 321, 852, 147, 458, 469, 159, 347, 28}\n");  radixsort(array, size);
} 

ReviewForJob——桶式排序+基数排序(==多次桶式排序)相关推荐

  1. 按复杂度有效性递减排序_十大经典排序算法:python源码实现,通俗深入讲解

    概述 提示:本文上万字,陆陆续续疏理知识点加测试代码,耗时近一个月.阅读时长40分钟左右. 本文将十大经典排序算法进行汇总,从源码实现.复杂度.稳定性进行分析,并对每种排序的特性进行点评.对典型算法, ...

  2. 数据结构——排序:插入排序、选择排序、交换排序、归并排序、基数排序

    排序 内部排序:数据量不大,在内存中可以完成排序. 外部排序:借助外存.把数据文件分成若干块,涉及内外存数据的转换.存储器的管理等. 稳定排序:能保证排序前两个相等的数其在序列的前后位置顺序和排序后它 ...

  3. 【完整可运行源码+GIF动画演示】十大经典排序算法系列——冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序

    以前也零零碎碎发过一些排序算法,但总是不系统, 这次彻底的对排序系列做了一个整体的规划, 小伙伴们快快mark哦~ [GIF动画+完整可运行源代码]C++实现 冒泡排序--十大经典排序算法之一 [GI ...

  4. 【GIF动画+完整可运行源代码】C++实现 基数排序——十大经典排序算法之十

    十大经典排序算法系列博客-->传送门 基数排序是按照低位先排序,然后收集:再按照高位排序,然后再收集:依次类推,直到最高位.有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序.最 ...

  5. 十大排序算法:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序

    冒泡排序.选择排序.插入排序.希尔排序.归并排序.快速排序.堆排序.计数排序.桶排序.基数排序的动图与源代码. 目录 关于时间复杂度 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 ...

  6. 【数据结构笔记38】桶排序、基数排序、多关键字排序、排序算法汇总比较

    本次笔记内容: 10.3.1 桶排序 10.3.2 基数排序 10.3.3 多关键字排序 10.4 排序算法比较 文章目录 排序算法背景 桶排序 基数排序 多关键字排序(基数排序) 排序算法的比较 排 ...

  7. java 线性的排序算法_数据结构之排序算法Java实现(9)—— 线性排序之 基数排序算法...

    基数排序算法是计数排序的延伸,计数排序会造成很大的空间浪费,但基数排序法是对位数进行排序,适合于位数之间相差较大的情况,废话不多说,直接上代码: 升序排序法: /** * 基数排序法 * 升序排列 * ...

  8. 排序1+3:基数排序(RadixSort),希尔排序(ShellSort)和快速排序(QuickSort)

    1 基数排序 基数排序对于整数特别有效.是一种稳定的算法(意思是相同的数字不会交换关系).基数排序是根据数字的性质来逐步根据个位数,十位数,百位数分类求得排序结果的方法之一.它的想法如下: (1)先将 ...

  9. 数据结构(八):排序 | 插入排序 | 希尔排序 | 冒泡排序 | 快速排序 | 简单选择排序 | 堆排序 | 归并排序 | 基数排序 | 外部排序 | 败者树 | 置换-选择排序 | 最佳归并树

    文章目录 第八章 排序 一.排序的基本概念 (一)什么是排序 (二)排序的应用 (三)排序算法的评价指标 (四)排序算法的分类 (五)总结 二.插入排序 (一)算法思想 (二)算法实现 (三)算法效率 ...

最新文章

  1. php缓存数据到本地缓存,本地缓存localStorage的使用方法
  2. java flex 上传文件_使用Flex和java servlet上传文件
  3. eclipse中图片大小用什么单位_建筑工程行业中各个单位都是什么样的关系?
  4. mysql schema是什么_MySQL中information_schema是什么
  5. 是什么让美国网站拒绝欧洲访问?- GDPR 带来的数据安全思考
  6. 微服务升级_SpringCloud Alibaba工作笔记0024---Nacos集群_以及持久化配置_架构说明
  7. UOJ276 [清华集训2016] 汽水 【二分答案】【点分治】【树状数组】
  8. Flutter入门进阶之旅(二)Hello Flutter
  9. BZOJ 1571: [Usaco2009 Open]滑雪课Ski
  10. ajax获取session值_【JavaWeb】91:Cookie与Session
  11. linux中间人攻击工具,[web安全]使用ARPspoof进行中间人(MiTM)攻击
  12. 5G十大细分应用场景研究报告
  13. [读史思考]北宋历史上几个外行项目经理
  14. 一度智信:电商平台商品定价策略
  15. 单机征途mysql步骤不对_征途单机版架设中场景服务器启动失败?这是为什么? 你怎么解决的啊?告诉我 谢谢...
  16. pairing function
  17. 华为 Python:初级能力测评
  18. Termux搭建图形化环境及tk开发
  19. matlab圆锥曲线,圆锥曲线:MATLAB绘制椭圆方程的图像 来充电吧
  20. python编程培训多少钱-编程培训多少钱,python编程培训多少钱

热门文章

  1. Codeforces Round #631 (Div. 2) C. Dreamoon Likes Coloring 构造
  2. P4288 [SHOI2014]信号增幅仪 最小圆覆盖
  3. [CQOI2017] 老C的键盘(树形dp + 组合数)
  4. [ZJOI2016]旅行者(网格图分治最短路)
  5. YBTOJ洛谷P2387: 魔法森林(LCT)
  6. YbtOJ#662-交通运输【线段树合并,树状数组】
  7. jzoj3895-数字对【RMQ,GCD,二分答案,单调队列】
  8. POJ2752-Seek the Name, Seek the Fame【KMP】
  9. 【期望】守卫挑战(金牌导航 期望-9)
  10. [XSY] 计数(DP,NTT,分治)