算法说明

若领图排序是分布排序的一种。

个人理解,若领图排序算是桶排序+计数排序的变异版,桶排序计数排序理解了,那么若领图排序理解起来就会比较容易。区别其实就是存储中间值的方式做了调整……

话说,这个代码我写的很烂很吃力,而且写好几个小时才写好,再次证明我的资质真的很差哟。。。

好了,结合代码大概说一下流程,其实主要是希望将来我自己再看到后能很快的回忆出思路。。。

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

最新文章

  1. Nginx编译配置杂记
  2. U-boot的目录结构及spl功能
  3. 延迟加载图片插件LazyLoad.js的使用方法
  4. Volley Get Post 方法
  5. 重学C++ (1)
  6. hadoop作业调优参数整理及原理【转】
  7. 过滤器(filter)实现用户登录拦截
  8. 修复CefSharp浏览器组件中文输入Bug
  9. Struts2--模块包含
  10. 如何在Oracle中复制表结构和表数据 【转载】
  11. HTTP协议(二)
  12. java 堆 栈 常量池
  13. C# - LINQ 语言集成查询
  14. [蓝桥杯]PREV-15.历届试题_格子刷油漆
  15. RNN(3) ------ “blog:RNN学习之路”
  16. 雷林鹏分享:jQuery EasyUI 插件
  17. ORA-27054错误处理
  18. plsql免安装客户端的配置
  19. display:table和display:table-cell结合使用
  20. 解题:BZOJ 3884 上帝与集合的正确用法

热门文章

  1. Linux 查看CPU,内存,硬盘 !转
  2. javascript滚动条之ScrollBar.js
  3. 如何让ThinkPHP的模板引擎达到最佳效率
  4. MyISAM 和 InnoDB 讲解
  5. php面试题之四——Linux部分(高级部分)
  6. [Effective JavaScript 笔记]第39条:不要重用父类的属性名
  7. [BZOJ1061][Noi2008]志愿者招募
  8. 我常用的delphi 第三方控件
  9. 解决android:theme=&quot;@android:style/Theme.NoDisplay&quot; 加入这句话后程序不能运行
  10. HDOJ 1596