Hark的数据结构与算法练习之若领图排序ProxymapSort
算法说明
若领图排序是分布排序的一种。
个人理解,若领图排序算是桶排序+计数排序的变异版,桶排序计数排序理解了,那么若领图排序理解起来就会比较容易。区别其实就是存储中间值的方式做了调整……
话说,这个代码我写的很烂很吃力,而且写好几个小时才写好,再次证明我的资质真的很差哟。。。
好了,结合代码大概说一下流程,其实主要是希望将来我自己再看到后能很快的回忆出思路。。。
1、找出待排数组的最大值(20-25行代码)。
2、根据最大值,建立计数数组,并对待排数组每个值进行计数(28-31行代码)(这个计数的过程其实就是分桶的过程,桶的大小根据你数字的实际情况去分, 我的桶就是去除小数部分的整数为一桶~)。
3、建立位置数组,记录根据计数数组,得出待排数组每个数字最终排序后的开始索引位置(例如1.1f,最终排序后会出现在索引1处,所以arrayPosition[1]=2。 大家将值代入一下就知道了,与计数排序合并计数器其实是一个道理)(35-44行代码)。
4、根据位置数组进行排序。 注意子数组使用的是插入排序来写入到arrayResult中的(所谓子数组,就是,例如位置1时,里边的子数组就是1.2f,1.1f,1.8f)(49-77行代码)
5、结束。。。
代码
使用的是java
package hark.sort.distributionsort; import java.util.Arrays; /*
* 若领图排序
*/
public class ProxmapSort {
public static void main(String[] args) {
float[] arrayData = { 6.7f, 5.9f, 8.4f, 1.2f, 7.3f, 3.7f, 11.5f, 1.1f,
4.8f, 0.4f, 10.5f, 6.1f, 1.8f };
float[] arrayResult = ProxmapSortMethod(arrayData);
for (float integer : arrayResult) {
System.out.print(integer);
System.out.print(" ");
}
} public static float[] ProxmapSortMethod(float[] arrayData) {
float maxNum = 0;
for (int i = 0; i < arrayData.length; i++) {
if (arrayData[i] > maxNum) {
maxNum = arrayData[i];
}
} // 计数数组,记录数字出现的次数
int[] arrayHitCount = new int[(int) maxNum + 1];
for (int i = 0; i < arrayData.length; i++) {
arrayHitCount[(int) arrayData[i]]++;
}
//System.out.println(Arrays.toString(arrayHitCount)); // 位置数组, 记录当前索引下的数字的起始位置
int[] arrayPosition = new int[(int) maxNum + 1];
int index = 0;
for (int i = 0; i < arrayHitCount.length; i++) {
if (arrayHitCount[i] > 0) {
arrayPosition[i] = index;
index = arrayHitCount[i] + index;
} else {
arrayPosition[i] = -1;
}
}
//System.out.println(Arrays.toString(arrayPosition)); // 根据位置数组,将排序好的数据存储至结果数组。
// 注:位置中的子数组使用的是插入排序
float[] arrayResult = new float[arrayData.length];
int pos;
float value, temp = 0;
for (int i = 0; i < arrayData.length; i++) {
value = arrayData[i];
pos = arrayPosition[(int) value]; if (pos >= 0) {
if (arrayResult[pos] > 0f) {
while (pos < arrayData.length) {
if (arrayResult[pos] == 0) // 如果arrayResult中值为0,则直接写入
{
arrayResult[pos] = value;
break;
} else if (arrayResult[pos] > value) // 如果arrayResult大于要比较的值,则进行,并且往后移动
{
temp = arrayResult[pos];
arrayResult[pos] = value;
value = temp;
pos++;
} else {
pos++;
}
}
} else {
arrayResult[pos] = value;
}
}
} return arrayResult;
}
}
参考
http://ww2.valdosta.edu/~sfares/cs330/cs3410.a.sorting.1998.fa.html
http://ju.outofmemory.cn/entry/59437
Hark的数据结构与算法练习之若领图排序ProxymapSort的更多相关文章
- JavaScript 数据结构与算法之美 - 十大经典排序算法汇总(图文并茂)
1. 前言 算法为王. 想学好前端,先练好内功,内功不行,就算招式练的再花哨,终究成不了高手:只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 ...
- Hark的数据结构与算法练习之基数排序
算法说明 基数排序是基于计数排序的,所以看这个之前要先看一下计数排序对于理解基数排序是很有帮助的(发现计数和基数的音节几乎一致啊).这个我有写,请点击. OK,现在你肯定已经熟悉了计数排序,那么我就来 ...
- 为什么我要放弃javaScript数据结构与算法(第九章)—— 图
本章中,将学习另外一种非线性数据结构--图.这是学习的最后一种数据结构,后面将学习排序和搜索算法. 第九章 图 图的相关术语 图是网络结构的抽象模型.图是一组由边连接的节点(或顶点).学习图是重要的, ...
- Hark的数据结构与算法练习之珠排序
---恢复内容开始--- 算法说明 珠排序是分布排序的一种. 说实在的,这个排序看起来特别的巧妙,同时也特别好理解,不过不太容易写成代码,哈哈. 这里其实分析的特别好了,我就不画蛇添足啦. 大家看一 ...
- Hark的数据结构与算法练习之鸽巢排序
算法说明 鸽巢排序是分布排序的一种,我理解其实鸽巢就是计数排序的简化版,不同之处就是鸽巢是不稳定的,计数排序是稳定的. 逻辑很简单,就是先找出待排数组的最大值maxNum,然后实例一个maxNum+1 ...
- Hark的数据结构与算法练习之锦标赛排序
算法说明 锦标赛排序是选择排序的一种. 实际上堆排序是锦标赛排序的优化版本,它们时间复杂度都是O(nlog2n),不同之处是堆排序的空间复杂度(O(1))远远低于锦标赛的空间复杂度(O(2n-1)) ...
- Hark的数据结构与算法练习之圈排序
算法说明 圈排序是选择排序的一种.其实感觉和快排有一点点像,但根本不同之处就是丫的移动的是当前数字,而不像快排一样移动的是其它数字.根据比较移动到不需要移动时,就代表一圈结束.最终要进行n-1圈的比较 ...
- Hark的数据结构与算法练习之梳排序
算法说明梳排序是交换排序的一种,它其实也是改自冒泡排序,不同之处是冒泡排序的比较步长恒定为1,而梳排序的比较步长是变化的. 步长需要循环以数组长度除以1.3,到最后大于等于1即可. 光说可能比较抽象, ...
- Hark的数据结构与算法练习之地精(侏儒)排序
算法说明 地精排序是交换排序的一种,它是冒泡排序的一种改良,我感觉和鸡尾酒排序挺像的. 不同之处是鸡尾酒排序是从小到大,然后再从大到小切换着排序的.而地精排序是上来先从小到大排序,碰到交换到再从大到小 ...
随机推荐
- Ubuntu 12.04 安装 Chrome浏览器
1,先到chrome官网下载一个安装包 http://www.google.com/intl/zh-CN/chrome/ 2,ctrl+alt+t 打开终端. 3,在终端里输入sudo apt-get ...
- Windows环境下 Node和NPM个性安装
常拿自己的电脑常用来测试各种Bug,所以始终奋斗在XP.IE6的环境下.让我们在如此级别的环境下,开始Node之路吧~~ 在过去,Node.js一直不支持在Windows平台下原生编译,需要借助Cyg ...
- 《深入PHP与jQuery开发》读书笔记——Chapter1
由于去实习过后,发现真正的后台也要懂前端啊,感觉javascript不懂,但是之前用过jQuery感觉不错,很方便,省去了一些内部函数的实现. 看了这一本<深入PHP与jQuery开发>, ...
- 微信公开课发布微信官方教程:教你用好微信JS-SDK接口
微信公众平台开放JS-SDK(微信内网页开发工具包),说明文档已经有相关使用方法和示例了,很多同学觉得不是很直观,为此微信公开课发布微信官方教程:教你用好微信JS-SDK接口. 1.分享类接口:支持获 ...
- CocoStudio基础教程(5)使用CocoStudio场景编辑器关联组件
1.概述 我们有了UI交互.有了动画人物.有了物理模拟,还差最后一步——将这些元素融合起来.这就要用到cocoStudio中的场景编辑器了.这次我们要将先前我们做过的所有东西都放到一个场景中去.这项工 ...
- cocos基础教程(2)Window环境下搭建
第一步:开始安装VS2012 第二步:下载Cocos2d-x 3.4源码 配置环境变量 COCOS_CONTROL = E:\cocos2d-x-3.4\tools\cocos2d-console ...
- Lua中的捕获
Lua中的捕获 捕获 捕获是这样一种机制:可以使用模式串的一部分匹配目标串的一部分.将你想捕获的模式用圆括号括起来,就指定了一个捕获.在string.find使用捕获的时候,函数会返回捕获的值作为 ...
- [Effective JavaScript 笔记] 第2条:理解JavaScript的浮点数
JavaScript数值型类型只有数字 js只有一种数值型数据类型,不管是整数还是浮点数,js都把归为数字. typeof 17; // “number” typeof 98.6; // “num ...
- ris'In App Purchase总结
原地址:http://www.cocoachina.com/bbs/read.php?tid=38555&page=1 In App Purchase属于iPhone SDK3.0的新特性,用 ...
- Action的动态调用方法
Action执行的时候并不一定要执行execute方法,我们可以指定Action执行哪个方法: 1. 方法一(通过methed属性指定执行方法): 可以在配置文件中配置Action的时候用method ...