桶排序的java实现

package com.edu.hpu.sort.bucket;

import java.util.LinkedList;
import java.util.List;

import com.edu.hpu.sort.Sort;
/*    排序原理:
    顺序从待排数组中取出数字,首先6被取出,然后把6入6号桶,这个过程类似这样:空桶[ 待排数组[ 0 ] ] = 待排数组[ 0 ]
    [6 2 4 1 5 9]           待排数组
    [0 0 0 0 0 0 6 0 0 0]   空桶
    [0 1 2 3 4 5 6 7 8 9]   桶编号(实际不存在)
    顺序从待排数组中取出下一个数字,此时2被取出,将其放入2号桶,是几就放几号桶
    [6 2 4 1 5 9]           待排数组
    [0 0 2 0 0 0 6 0 0 0]   空桶
    [0 1 2 3 4 5 6 7 8 9]   桶编号(实际不存在)
    3,4,5,6省略,过程一样,全部入桶后变成下边这样
    [6 2 4 1 5 9]           待排数组
    [0 1 2 0 4 5 6 0 0 9]   空桶
    [0 1 2 3 4 5 6 7 8 9]   桶编号(实际不存在)
 */
public class BucketSort extends Sort {
    private int range = 0;
    public BucketSort(int range) {
        this.range = range;
    }
    @Override
    public int[] doSort(int[] arr) {
        @SuppressWarnings("unchecked")
        // 构造辅助数组
        List<Integer> [] aux = new LinkedList[range];
        for(int i = 0; i < aux.length; i++){
            aux[i] = new LinkedList<Integer>();
        }
        for(int i = 0; i < arr.length; i++){
            // 找打元素在桶中的位置,并将其添加
            aux[arr[i]].add(arr[i]);
        }
        for(int i = 0, j = 0; i < aux.length && j < arr.length; i++){
            for(int v : aux[i]){
                arr[j] = v;
                j++;
            }
        }
        return arr;
    }
    public static void main(String[] args) {
        Sort sort = new BucketSort(10);
        sort.printOrder(new int []{4, 1, 3, 2, 6, 9, 9});
    }

}
时间: 2024-10-10 13:40:27

桶排序的java实现的相关文章

Java实现桶排序

详细讲解见<算法导论>8.4节--桶排序. Java代码如下: package linetimesort; import java.util.LinkedList; import sort.InsertSort; /** * 桶排序假设输入元素均匀而独立的分布在区间[0,1)上: * 桶排序的核心思想是,将[0,1)分为n个大小相同的子区间, * 上一个区间里的元素都比下一个区间里的元素小,然后对 * 所有区间里的元素排序,最后顺序输出所有区间里的元素, * 达到对所有元素排序的目的. * @

桶排序java

import java.util.ArrayList;import java.util.Iterator;/** * 桶排序:桶排序的思想是把区间[0,1)划分成n个相同大小的子区间,称为桶,然后将n个输入数分布到各个桶中去. * 因为输入数均匀且独立分布在[0,1)上,所以,一般不会有很多数落在一个桶中的情况. * 为了得到结果,先对各个桶中的数进行排序,然后按次序把各桶中的元素列出来. * 桶排序的时间复杂度为O(n) */public class BucketSort { /** * 桶排

桶排序(BucketSort)(java)

一.原理 桶排序的工作原理是吧区间划分为n个大小相同的子区间,这样的区间称为桶.然后将n个输入的数分步到各个桶中去.每个桶再个别的排序,然后按照次序吧各个桶 中的元素列出来即可. 二.时间复杂度 桶排序是一种鸽巢排序的一种归纳结果.当要被排序阵列内的数值是均匀分配的时候,桶排序使用线性时间(O(n)).但桶排序并不是比较排序,它不受 O(nlongn)下限的影响. eg:对大小为[1...1000]范围内的n个整数A[1..n]排序.可以把桶设置为大小为10的范围,具体而言设集合B[1]存储[1

排序算法Java实现

排序算法Java实现 排序算法的分类: 内部排序,在排序过程中,全部记录放在内存中,称为内部排序: 外部排序,在排序过程中需要使用外部存储(磁盘),则称为外部排序. 主要介绍内部排序: 插入排序:直接插入排序.二分法插入排序.希尔排序 选择排序:简单选择排序.堆排序 交换排序:冒泡排序.快速排序 归并排序 基数排序 插入排序 直接插入排序 基本思想:对于给定的一组记录,初始时假设第一个记录自成一个有序序列,其余记录为无序序列.接着从第二个记录开始,按照记录的大小依次将当前处理的记录插入到其之前的

啊哈!算法之快速排序与桶排序

啊哈!算法之快速排序与桶排序 1.快速排序算法 快速排序由 C. A. R. Hoare(东尼·霍尔,Charles Antony Richard Hoare)在1960 年提出,之后又有许多人做了进一步的优化.在数列种随机找出一个基准数,因为数列是杂乱的,所以取首项为基准数.从后往前找到比基准数大的位置,再从前往后找到比基准数小的位置,交换元素:右游标向前移动与左游标向后移动,它们相遇时用基准数的位置与相遇的位置交换.此时原来数列以相遇的位置被划分为了两个需要排序的数列,再次执行上述过程:当左

基本算法复习--排序(java实现)

日常操作中常见的排序方法有:冒泡排序.快速排序.选择排序.插入排序.希尔排序,甚至还有基数排序.鸡尾酒排序.桶排序.鸽巢排序.归并排序等. 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端. 代码 /**   * 冒泡法排序<br/> * <li>比较相邻的元素.如果第一个比第二个

九大排序算法Java实现

之前学习数据结构与算法时花了三天时间整理九大排序算法,并采用Java语言来实现,今天第一次写博客,刚好可以把这些东西从总结的文档中拿出来与大家分享一下,同时作为自己以后的备忘录. 1.排序算法时间复杂度.稳定性分类: 2.排序算法问题描述与实现 2.1冒泡排序(交换排序-稳定) [问题描述]对于一个int数组,请编写一个冒泡排序算法,对数组元素排序. 问题分析:冒泡排序,顾名思义,从前往后遍历,每次遍历在末尾固定一个最大值. 易错点:每次内层循环结束都会在末尾确定一个元素的位置,因此内层循环的判

排序算法&lt;No.2&gt;【桶排序】

算法,是永恒的技能,今天继续算法篇,将研究桶排序. 算法思想: 桶排序,其思想非常简单易懂,就是是将一个数据表分割成许多小数据集,每个数据集对应于一个新的集合(也就是所谓的桶bucket),然后每个bucket各自排序,或用不同的排序算法,或者递归的使用bucket sort算法,往往采用快速排序.是一个典型的divide-and-conquer分而治之的策略. 其中核心思想在于如何将原始待排序的数据划分到不同的桶中,也就是数据映射过程f(x)的定义,这个f(x)关乎桶数据的平衡性(各个桶内的数

八大排序算法Java(转)

目录(?)[-] 概述 插入排序直接插入排序Straight Insertion Sort 插入排序希尔排序Shells Sort 选择排序简单选择排序Simple Selection Sort 选择排序堆排序Heap Sort 交换排序冒泡排序Bubble Sort 交换排序快速排序Quick Sort 归并排序Merge Sort 桶排序基数排序Radix Sort 总结 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序