桶排序(BucketSort)(java)

一、原理

    桶排序的工作原理是吧区间划分为n个大小相同的子区间,这样的区间称为桶。然后将n个输入的数分步到各个桶中去。每个桶再个别的排序,然后按照次序吧各个桶

中的元素列出来即可。

二、时间复杂度

    桶排序是一种鸽巢排序的一种归纳结果。当要被排序阵列内的数值是均匀分配的时候,桶排序使用线性时间(O(n))。但桶排序并不是比较排序,它不受

O(nlongn)下限的影响。

    eg:对大小为[1...1000]范围内的n个整数A[1..n]排序。可以把桶设置为大小为10的范围,具体而言设集合B[1]存储[1..10]的整数,集合B[2]存储(10..20]的整数,

i=1,2,,100.总共100个桶然后扫描A[i],吧每个A[i]放入到对应的B[j]中。然后再对每个桶里的数字排序。

    假设有n个数字,有m个桶,如果数字是平均分布的,则每个桶里面平均有n/m个数字。如果每个桶里中的数字采用快速排序,那么整个算法的复杂度是

O(n+m*n/m*log(n/m)) = O(n+nlogn-nlogm).当m接近n时,桶排序复杂度接近O(n)。

三、代码
import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
import java.util.List;

public class BucketSort {    

    int bucketSize = 10    

    int arraySize = 1000;

    public static void main(String[] args) {
      // TODO Auto-generated method stub
      BucketSort bs = new BucketSort();
      int[] array = bs.getArray();
      bs.bucketSort(array);
    }

    public int[] getArray(){
      int[] arr = new int[arraySize /3];
      Random r = new Random();
      for(int i = 0; i < arraySize /3 ; i++)
      {
        arr[i] = r.nextInt(100000);
      }
      return arr;

    }

    public void bucketSort(int[] a)
    {
      List<Integer> bucket[] = new ArrayList[bucketSize];

      for(int i=0; i < a.length ; i++)
      {
        int temp = a[i]/10000;
        if(bucket[temp] == null)
        {
          bucket[temp] = new

          ArrayList<Integer>();
        }
        bucket[temp].add(a[i]);
      }

      //对桶内各个元素进行排序
      for(int j=0;j<bucketSize;j++)
      {
        intsertSort(bucket[j]);
        printList(bucket[j]);
      }
    }

    private void printList(List<Integer> list) {
      // TODO Auto-generated method stub
      while(list.size()>0)
      {
        System.out.print(list.remove(0) +"\t");
      }
    }

    private void intsertSort(List<Integer> list) {
      // TODO Auto-generated method stub
      Collections.sort(list);
    }

}

原文地址:https://www.cnblogs.com/weiliuyby/p/8418828.html

时间: 2024-10-17 11:12:56

桶排序(BucketSort)(java)的相关文章

桶排序的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

Java实现桶排序

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

线性排序算法---- 计数排序, 基数排序, 桶排序

排序算法里,除了比较排序算法(堆排序,归并排序,快速排序),还有一类经典的排序算法-------线性时间排序算法.听名字就让人兴奋! 线性时间排序,顾名思义,算法复杂度为线性时间O(n) , 非常快,比快速排序还要快的存在,简直逆天.下面我们来仔细看看三种逆天的线性排序算法, 计数排序,基数排序和桶排序. 1计数排序  counting Sort 计数排序 假设 n个 输入元素中的每一个都是在 0 到 k 区间内的一个整数,当 k= O(N) 时,排序运行的时间为 O(N). 计数排序的基本思想

桶排序java

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

基于非比较的排序:计数排序(countSort),桶排序(bucketSort),基数排序(radixSort)

计数排序 条件:要排序的数组的元素必须是在一定范围的,比如是1~100.在排序之前我们必须知道数组元素的范围. 思路:顾名思义:就是用一个数组来计数的. 步骤: 1.用一个数组来计数count[ ],将要排序的数组arr[ ]的元素记为数组count[ ]数组的下标,如果数组arr[]中有两个数相同就在count[]++.如count[arr[i]]++. 2. 再一次遍历数组count[ ],将count[i]  +=  count[i-1]+count[i-2]+....+count[0],

基于非比較的排序:计数排序(countSort),桶排序(bucketSort),基数排序(radixSort)

计数排序 条件:要排序的数组的元素必须是在一定范围的,比方是1~100.在排序之前我们必须知道数组元素的范围. 思路:顾名思义:就是用一个数组来计数的. 步骤: 1.用一个数组来计数count[ ],将要排序的数组arr[ ]的元素记为数组count[ ]数组的下标,假设数组arr[]中有两个数同样就在count[]++.如count[arr[i]]++. 2. 再一次遍历数组count[ ],将count[i]  +=  count[i-1]+count[i-2]+....+count[0],

排序算法Java实现

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

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

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

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

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