BucketSort

code 1:

 1 public static void bucketSort(int[] array) {
 2     int len = array.length;
 3     int min = array[0], max = array[0];
 4     // 找出最小值、最大值
 5     for (int i : array) {
 6         if (i < min)
 7             min = i;
 8         if (i > max)
 9             max = i;
10     }
11     //
12     int[] tmp = array.clone();
13     // 生成n个桶
14     int[] buckets = new int[max - min + 1];
15     for (int i : array)
16         buckets[i - min]++;
17     for (int i = 1; i < buckets.length; i++)
18         buckets[i] += buckets[i - 1];
19     for (int i = len - 1; i >= 0; i--)
20         array[--buckets[tmp[i] - min]] = tmp[i];
21 //    for (int i = 0; i < len; i++)
22 //        array[--buckets[tmp[i] - min]] = tmp[i];
23 }

code 2:

 1 public static void bucketSort(int[] array) {
 2     int min = array[0];
 3     int max = array[0];
 4     for (int tmp : array) {
 5         if (tmp < min)
 6             min = tmp;
 7         if (tmp > max)
 8             max = tmp;
 9     }
10     int[] buckets = new int[max - min + 1];
11     for (int v : array)
12         buckets[v - min]++;
13     int k = 0;
14     for (int i = 0; i < buckets.length; i++)
15         for (int j = 0; j < buckets[i]; j++)
16             array[k++] = i + min;
17 }
时间: 2024-10-06 05:15:56

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],

桶排序(BucketSort)(java)

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

BucketSort Implementation

Imagine you have an array like this (note that the array has duplicates, and includes 0 and k): a = [ 4, 64, 200, 42, 56, 22, 1, 64, 0, 161, 200, 0, 42 ] What you know about this array is Values are integers Values are non-negative and less than some

基数排序与桶排序,计数排序【详解】

桶排序简单入门篇^-^ 在我们生活的这个世界中到处都是被排序过的东东.站队的时候会按照身高排序,考试的名次需要按照分数排序,网上购物的时候会按照价格排序,电子邮箱中的邮件按照时间排序……总之很多东东都需要排序,可以说排序是无处不在.现在我们举个具体的例子来介绍一下排序算法. 首先出场的是我们的主人公小哼,上面这个可爱的娃就是啦.期末考试完了老师要将同学们的分数按照从高到低排序.小哼的班上只有5个同学,这5个同学分别考了5分.3分.5分.2分和8分,哎,考得真是惨不忍睹(满分是10分).接下来将分

桶排序

假设现在有一组小于M的正整数 a1. a2 ,-- ,an ,对它们排序可以采用以下的思路:使用一个大小为M的数组buckets,这个数组的每一个单元称为一个个的bucket,桶,初始化全部为0.扫描数组a,当扫描到ai的时候,buckets[ai] 加1.这样当a扫描完之后,扫描buckets,打印非零单元的下标,它的值是几就打印几次.打印出来的值实际上就是排好序之后的数组a了.我们可以依次把它们赋值给a,使得a有序. 代码如下: #include<iostream> using names

桶排序总结

数据结构排序算法之——桶排序(Bucket sort) 插入排序想关链接: 维基百科:https://zh.wikipedia.org/wiki/%E6%A1%B6%E6%8E%92%E5%BA%8F 极客学院想关介绍:http://wiki.jikexueyuan.com/project/easy-learn-algorithm/bucket-sort.html 桶排序主要用于有大量重复数据和明确知道数据边界的情况下,进行统计的排序 基本的算法思想是: 假设数据的边界的长度为arrayLen,

js 数组排序和算法排序

1.算法排序 a.插入排序 var arr = [23,34,3,4,23,44,333,444]; var arrShow = (function insertionSort(array){ if(Object.prototype.toString.call(array).slice(8,-1) ==='Array'){ for (var i = 1; i < array.length; i++) { var key = array[i]; var j = i - 1; while (j >

C#12种顺序排序

这篇主要写关于顺序排序的十二种算法,也是我有关算法的第一帖.主要是写,对每种算法的理解与测试. 速度测试,主要根据一千.一万.五万.百万这 四种.速度纪录还是用Stopwatch 这个类.使用随机数Random生成随机的集合. 其中数量五万左右的小数量排序,使用快速排序,速度最快.大数量百万左右使用鸽巢排序,速度最快.废话不多说,接下来上代码. 第一种:冒泡排序 冒泡排序我相信是每个程序员,都会学到的一种比较排序算法.非常简单,通过多次重复比较每对相邻元素,并按规定的顺序交换他们,最终把数列进行