桶排序的数组实现和链表实现

来源:互联网 发布:angularjs 读取json 编辑:程序博客网 时间:2024/06/07 18:51
/** * 桶排序的数组实现和链表实现 * 桶排序是一种稳定的算法 * @author shuaicenglou * */public class BucketSort {    public static void main(String[] args) {        int[] test = {5,4,3,2,1};        linkListBucket(test, 1,5);        for(int i:test) System.out.println(i);    }    /**     * 桶排序链表实现     * 适用于复杂对象保存相对位置     * 通过node.down==null?是空不打印:不空打印     * 来改动原数组     * @param array     * @param min     * @param max     */    public static void linkListBucket(int[] array,int min,int max){        //此处应做min与max的大小关系检查,发现不合法立即退出        ListNode head = new ListNode(),point = head;        head.var = min;        for(int i=min+1;i<=max;i++){      //初始化辅助存储链表            ListNode node = new ListNode();            node.var = i;            point.right = node;            point = node;        }        for(int i:array){            point = head;     //重置头指针            for(int j=min;j<=max;j++){                if(j==i){     //找到位置                    ListNode n = new ListNode(); //为元素创建新节点                    n.var = i;                    ListNode dCache = point;     //向下移动的指针                    while(dCache.down!=null) dCache = dCache.down; //若元素已重复则执行这一步,没有重复则不会执行                    dCache.down = n;                }                point = point.right;             //指针右移            }        }        int count = 0;        //接下来改变原数组        point = head;     //重置头指针        for(int j=min;j<=max;j++){            if(point.down!=null){                ListNode dCache = point.down;                while(dCache!=null){                    array[count++] = dCache.var;                    dCache = dCache.down;                }            }            point = point.right;        }    }    /**     * 不改变原数组,仅在函数中打印辅助存储里的数值     * 辅助空间使用数组,仅适用于int,不适用于复杂对象     * @param array 待排序数组     * @param min   数组中元素的下限     * @param max   数组中元素的上限     */    public static void arrayBucket(int[] array,int min,int max){        //此处应做min与max的大小关系检查,发现不合法立即退出        int size = max-min+2;   //此处额外多申请一个空间,将[0]置为下限,方便复制        int[] cache = new int[size];        cache[0] = min;        for(int i:array){            int len = i-min;            cache[len+1] += 1;        }        for(int i=1;i<cache.length;i++){            for(int j=0;j<cache[i];j++) System.out.println(cache[0]+i-1);        }    }    /**     * 改变原数组的元素顺序,不打印     * @param array     * @param min     * @param max     */    public static void arrayBucket2(int[] array,int min,int max){        int size = max-min+2;        int[] cache = new int[size];        cache[0] = min;        for(int i:array){            int len = i-min;            cache[len+1] += 1;        }        int count = 0;        for(int i=1;i<cache.length;i++){            for(int j=0;j<cache[i];j++) array[count++] = cache[0]+i-1;   //min+i-1        }    }}class ListNode{    public int var;             //值,此处可以是对象或者其他复杂对象    public ListNode right,down; //right相当于next指针,down用于存放值相同但是其他特征不同的对象,保持相对次序,输出时按顺序输出即可保持相对顺序}
原创粉丝点击