用JAVA实现桶排序(Bucket Sort0)

栏目: 编程工具 · 发布时间: 5年前

内容简介:用JAVA实现桶排序:桶排序 需要记住的重点:1)Bucket Sort也称为bin sort,因为您创建Bucket或bin来对输入进行排序。

JAVA 实现桶排序:

<b>import</b> java.util.ArrayList;
<b>import</b> java.util.Arrays;
<b>import</b> java.util.Collections;
<b>import</b> java.util.List;

<font><i>/*
 * Java程序使用基数 排序 算法对整数数组进行排序。
 * input: [80, 50, 30, 10, 90, 60, 0, 70, 40, 20, 50]
 * output: [0, 10, 20, 30, 40, 50, 50, 60, 70, 80, 90]
 * 
 * 解决方案的时间复杂性:
 *     最佳情况O(n); 平均情况O(n); 最坏情况O(n ^ 2)。
 * 
 */</i></font><font>

<b>public</b> <b>class</b> BuckeSort {

  <b>public</b> <b>static</b> <b>void</b> main(String[] args) {

    System.out.println(</font><font>"Bucket sort in Java"</font><font>);
    <b>int</b>[] input = { 80, 50, 30, 10, 90, 60, 0, 70, 40, 20, 50 };

    System.out.println(</font><font>"integer array before sorting"</font><font>);
    System.out.println(Arrays.toString(input));

    </font><font><i>// sorting array using radix Sort Algorithm</i></font><font>
    bucketSort(input);

    System.out.println(</font><font>"integer array after sorting using bucket sort algorithm"</font><font>);
    System.out.println(Arrays.toString(input));

  }

  </font><font><i>/**
   * 
   * @param input
   */</i></font><font>
  <b>public</b> <b>static</b> <b>void</b> bucketSort(<b>int</b>[] input) {
    </font><font><i>// get hash codes</i></font><font>
    <b>final</b> <b>int</b>[] code = hash(input);
    
    </font><font><i>// create and initialize buckets to ArrayList: O(n)</i></font><font>
    List[] buckets = <b>new</b> List[code[1]];
    <b>for</b> (<b>int</b> i = 0; i < code[1]; i++) {
      buckets[i] = <b>new</b> ArrayList();
    }
    
    </font><font><i>// distribute data into buckets: O(n)</i></font><font>
    <b>for</b> (<b>int</b> i : input) {
      buckets[hash(i, code)].add(i);
    }
    
    </font><font><i>// sort each bucket O(n)</i></font><font>
    <b>for</b> (List bucket : buckets) {
      Collections.sort(bucket);
    }
    
    <b>int</b> ndx = 0;
    </font><font><i>// merge the buckets: O(n)</i></font><font>
    <b>for</b> (<b>int</b> b = 0; b < buckets.length; b++) {
      <b>for</b> (<b>int</b> v : buckets[b]) {
        input[ndx++] = v;
      }
    }
  }

  </font><font><i>/**
   * 
   * @param input
   * @return an array containing hash of input
   */</i></font><font>
  <b>private</b> <b>static</b> <b>int</b>[] hash(<b>int</b>[] input) {
    <b>int</b> m = input[0];
    <b>for</b> (<b>int</b> i = 1; i < input.length; i++) {
      <b>if</b> (m < input[i]) {
        m = input[i];
      }
    }
    <b>return</b> <b>new</b> <b>int</b>[] { m, (<b>int</b>) Math.sqrt(input.length) };
  }

  </font><font><i>/**
   * 
   * @param i
   * @param code
   * @return
   */</i></font><font>
  <b>private</b> <b>static</b> <b>int</b> hash(<b>int</b> i, <b>int</b>[] code) {
    <b>return</b> (<b>int</b>) ((<b>double</b>) i / code[0] * (code[1] - 1));
  }

}


Output
Bucket sort in Java
integer array before sorting
<p>[80, 50, 30, 10, 90, 60, 0, 70, 40, 20, 50]
integer array after sorting using bucket sort algorithm
<p>[0, 10, 20, 30, 40, 50, 50, 60, 70, 80, 90]
</font>

桶排序 需要记住的重点:

1)Bucket Sort也称为bin sort,因为您创建Bucket或bin来对输入进行排序。

2)Bucket排序仅在输入均匀分布在一个范围内(如硬币、数字1到100等)时才有用。

3)可以使用链表或数组作为存储桶。数据结构的选择会影响插入时间。也可以将哈希表用作存储桶。

4)bucket排序是一种罕见的O(N)排序算法,即bucket排序的时间复杂度是最佳和平均情况下的线性函数,而不是像quicksort或mergesort那样的NLogN。

5)Bucket排序不是一个稳定的排序算法,因为在一个稳定的算法中,如果两个输入相同,它们将按排序顺序保留它们的位置,而在存储桶中,它取决于您对单个存储桶的排序方式。 不过,桶排序也可以变得稳定,称为基数排序。

6)您可以通过递归调用bucket排序或使用单独的排序算法(例如插入排序、冒泡排序或快速排序)对单个bucket中的元素进行排序。

7)Bucket排序是原地 排序算法 吗?不,它不是。整个想法是输入在移动到桶时自行排序。在最糟糕的情况下(顺序值,但不重复),所需的额外空间与原始数组一样大。

8)Bucket排序的最坏情况复杂性,当所有元素最终都在同一个桶中时为O(n ^ 2),因为它必须通过不同的排序算法进行排序。

9)bucket排序的空间复杂度为o(n),因为即使对无重复的顺序值进行排序,也需要一个与原始数组一样大的数组。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Spring框架高级编程

Spring框架高级编程

约翰逊 / 蒋培 / 机械工业出版社 / 2006-4 / 59.00元

Spring框架是主要的开源应用程序开发框架,它使得Java/J2EE开发更容易、效率更高。本书不仅向读者展示了Spring能做什么?而且揭示了Spring完成这些功能的原理,解释其功能和动机,以帮助读者使用该框架的所有部分来开发成功的应用程序。本书涵盖Spring的所有特性,并且演示了如何将其构成一个连贯的整体,帮助读者理解Spring方法的基本原理、何时使用Sping以及如何效仿最佳实践。所有......一起来看看 《Spring框架高级编程》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换