`
yaerfeng1989
  • 浏览: 223974 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java基数排序算法代码下载

阅读更多

原文:java基数排序算法代码下载 代码下载地址:http://www.zuidaima.com/share/1550463272684544.htm

基数排序:基数排序可以说是扩展了的桶式排序, * 比如当待排序列在一个很大的范围内,比如0到999999内,那么用桶式排序是很浪费空间的。 * 而基数排序把每个排序码拆成由d个排序码,比如任何一个6位数(不满六位前面补0)拆成6个排序码, * 分别是个位的,十位的,百位的。。。。 * 排序时,分6次完成,每次按第i个排序码来排。 * 一般有两种方式: * 1) 高位优先(MSD): 从高位到低位依次对序列排序 * 2) 低位优先(LSD): 从低位到高位依次对序列排序 * 计算机一般采用低位优先法(人类一般使用高位优先),但是采用低位优先时要确保排序算法的稳定性。 * 基数排序借助桶式排序,每次按第N位排序时,采用桶式排序。 * 对于如何安排每次落入同一个桶中的数据有两种安排方法: * 1)顺序存储:每次使用桶式排序,放入r个桶中,相同时增加计数。 * 2)链式存储:每个桶通过一个静态队列来跟踪。

 

package com.zuidaima.javasort.radixsorter;  
  
import java.util.Arrays; 
/**
*@author www.zuidaima.com
**/
  
public class RadixSorter {  
public static boolean USE_LINK=true;  
      
    public void sort(int[] keys,int from ,int len,int radix, int d)  
    {  
        if(USE_LINK)  
        {  
            link_radix_sort(keys,from,len,radix,d);  
        }  
        else  
        {  
            array_radix_sort(keys,from,len,radix,d);  
        }  
          
    }  
      
      
    private final void array_radix_sort(int[] keys, int from, int len, int radix,  
            int d)   
    {  
        int[] temporary=new int[len];  
        int[] count=new int[radix];  
        int R=1;  
          
        for(int i=0;i<d;i++)  
        {  
            System.arraycopy(keys, from, temporary, 0, len);  
            Arrays.fill(count, 0);  
            for(int k=0;k<len;k++)  
            {  
                int subkey=(temporary[k]/R)%radix;  
                count[subkey]++;  
            }  
            for(int j=1;j<radix;j++)  
            {  
                count[j]=count[j]+count[j-1];  
            }  
            for(int m=len-1;m>=0;m--)  
            {  
                int subkey=(temporary[m]/R)%radix;  
                --count[subkey];  
                keys[from+count[subkey]]=temporary[m];  
            }  
            R*=radix;  
        }  
             
    }  
  
  
    private static class LinkQueue  
    {  
        int head=-1;  
        int tail=-1;  
    }  
    private final void link_radix_sort(int[] keys, int from, int len, int radix, int d) {  
          
        int[] nexts=new int[len];  
          
        LinkQueue[] queues=new LinkQueue[radix];  
        for(int i=0;i<radix;i++)  
        {  
            queues[i]=new LinkQueue();  
        }  
        for(int i=0;i<len-1;i++)  
        {  
            nexts[i]=i+1;  
        }  
        nexts[len-1]=-1;  
          
        int first=0;  
        for(int i=0;i<d;i++)  
        {  
            link_radix_sort_distribute(keys,from,len,radix,i,nexts,queues,first);  
            first=link_radix_sort_collect(keys,from,len,radix,i,nexts,queues);  
        }  
        int[] tmps=new int[len];  
        int k=0;  
        while(first!=-1)  
        {  
          
            tmps[k++]=keys[from+first];  
            first=nexts[first];  
        }  
        System.arraycopy(tmps, 0, keys, from, len);  
          
          
    }  
    private final void link_radix_sort_distribute(int[] keys, int from, int len,  
            int radix, int d, int[] nexts, LinkQueue[] queues,int first) {  
          
        for(int i=0;i<radix;i++)queues[i].head=queues[i].tail=-1;  
        while(first!=-1)  
        {  
            int val=keys[from+first];  
            for(int j=0;j<d;j++)val/=radix;  
            val=val%radix;  
            if(queues[val].head==-1)  
            {  
                queues[val].head=first;  
            }  
            else   
            {  
                nexts[queues[val].tail]=first;  
                  
            }  
            queues[val].tail=first;  
            first=nexts[first];  
        }  
          
    }  
    private int link_radix_sort_collect(int[] keys, int from, int len,  
            int radix, int d, int[] nexts, LinkQueue[] queues) {  
        int first=0;  
        int last=0;  
        int fromQueue=0;  
        for(;(fromQueue<radix-1)&&(queues[fromQueue].head==-1);fromQueue++);  
        first=queues[fromQueue].head;  
        last=queues[fromQueue].tail;  
          
        while(fromQueue<radix-1&&queues[fromQueue].head!=-1)  
        {  
            fromQueue+=1;  
            for(;(fromQueue<radix-1)&&(queues[fromQueue].head==-1);fromQueue++);  
              
            nexts[last]=queues[fromQueue].head;  
            last=queues[fromQueue].tail;  
              
        }  
        if(last!=-1)nexts[last]=-1;  
        return first;  
    }  
      
    public static void main(String[] args) {  
        int[] a={1,4,8,3,2,9,5,0,7,6,9,10,9,135,14,15,11,33,999999999,222222222,1111111111,12,17,45,16};  
        USE_LINK=true;  
        RadixSorter sorter=new RadixSorter();  
        sorter.sort(a,0,a.length,10,10);  
        for(int i=0;i<a.length;i++)  
        {  
            System.out.print(a[i]+",");  
        }  
  
  
    }  

 标签: 算法 排序 基数 java话题: 语言基础

分享到:
评论

相关推荐

    基数排序java代码

    基数排序java代码,望对大家有帮助,谢谢!

    java实现基数排序算法

    基数排序的关键思想是按照数字的个位、十位、百位等逐个进行计数排序,从最低位到最高位。在每个位上,使用计数排序来稳定地排序数组。通过多次迭代,对所有位进行排序后,最终得到有序的数组。 在示例代码中,我们...

    基数排序 java实现

    自己写的插入排序,随机产生1000次,每次产生0-1000个数,验证算法正确性。java实现。

    [Java算法-排序练习]基数排序.java

    此外,文档还包括一个逐步指南,介绍了如何在Java中实现基数排序,包括详细的代码示例和实现细节。 文档还涵盖了高级主题,如如何优化代码以提高性能以及如何处理大的数组。该资源包括实用练习,让读者可以练习在...

    Java各种排序算法(含代码)

    Java各种排序算法集合: 1)插入排序(直接插入排序、希尔排序) 2)交换排序(冒泡排序、快速排序) 3)选择排序(直接选择排序、堆排序) 4)归并排序 5)分配排序(箱排序、基数排序)

    Java实现排序算法.rar

    Java实现八大排序算法,算法描述以及代码实现, 1. 直接插入排序 2. 希尔排序 3. 简单选择排序 4. 堆排序 5. 冒泡排序 6. 快速排序 7. 归并排序 8. 基数排序

    八大排序算法总结(含Java实现源代码)

    总结了常用的八大排序算法:(交换式:1、冒泡,2、快排; 选择式:3、选择, 4、堆排; 插入式:5、插入, 6、希尔; 其他:7、归并, 8、基数排序)。 并包含了Java实现的源代码。

    Java数据挖掘常见18种算法实现和10种常见排序算法以及其他相关经典DM算法集合.zip

    Java数据挖掘18大算法实现和10大常见排序算法以及其他相关经典DM算法集合。 18大数据挖掘的经典算法以及代码实现,涉及到了决策分类,聚类,链接挖掘,关联挖掘,模式挖掘等等方面,后面都是相应算法的文章,希望能够...

    java十二种排序算法实现源代码(类)

    java常用的排序算法 冒泡排序,选择排序,插入排序,稀尔排序,快速排序,归并排序,堆排序,桶式排序,基数排序,含鸡尾排序。以及二叉树和拓扑结构!

    Java语言实现基数排序代码分享

    主要介绍了Java语言实现基数排序代码分享,具有一定借鉴价值,需要的朋友可以参考下。

    各种排序算法的详细分析

    此为一个利用Java语言编写的排序分析程序,程序中统计了各种排序算法(冒泡排序、选择排序、插入排序、希尔排序、快速排序、堆排序、归并排序、基数排序)的分析,ppt中包含各种排序算法的分析,附上动画演示(来自...

    7大排序算法详解文档及java代码实现(可直接运行)

    7大排序算法详解文档,包括冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序、基数排序。附带java代码实现,可以直接运行。

    Java 七种排序算法实现

    这里提供了冒泡排序,插入排序,递归排序,基数排序,快速排序,选择排序,希尔排序这几种排序算法。里面有大量的注释,可以理解实现思路

    JAVA排序算法收集处

    这里包含了使用java语言的几大排序算法包括:插入排序、冒泡排序、归并排序、基数排序、希尔排序、快速排序、基数排序、选择排序。 jdk版本1.8 打开方式:解压后打开eclipse直接导入项目即可查看和运行代码。方便...

    8中排序算法(java实现)

    以下排序的Java代码实现: 插入排序(直接插入排序、二分法插入排序、希尔排序) 选择排序(简单选择排序、堆排序) 交换排序(冒泡排序、快速排序) 归并排序 基数排序

    常见排序算法(java代码实现)

    冒泡,归并,快速,插入,基数,希尔,堆排序等排序算法使用java实现

    各种排序代码的JAVA实现

    包括了堆排序 归并排序 快速排序 基数排序 选择排序 冒泡排序 插入排序 希尔排序 计数排序 桶排序等算法。

    【超全!】图解Java数据结构和算法(共195集)【资料+视频+课件+代码+笔记】

    稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、...

    Java 算法实现代码.rar

    1.排序的定义: 所谓排序算法,即通过特定的算法因式将一组或多组数据按照既定模式进行重新排序。这种新序列遵循着一定的规则,体现出一定的规律,因此,经处理后的数据便于筛选和计算,大大提高了计算效率...基数排序

    java二分法排序源码-Article:十大经典排序算法动画,看我就够了!

    常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。 用一张图概括: 关于时间复杂度: 平方阶 (O(n2)) 排序 各类简单排序:直接插入、直接选择和冒泡排序。 ...

Global site tag (gtag.js) - Google Analytics