桶排序和基数排序

Posted 互联网之瞳

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了桶排序和基数排序相关的知识,希望对你有一定的参考价值。

桶排序代码:

桶排序代码:

import java.util.Arrays;

/**
* 桶排序
* 工作的原理是将数组分到有限数量的桶里
* 每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)
* 桶排序是鸽巢排序的一种归纳结果。当要被排序的数组内的数值是均匀分配的时候,桶排序使用线性时间O(N)
* 但桶排序并不是比较排序,它不受到O(n log n) 下限的影响
*
* 时间复杂度: O(N+C),其中C=N*(logN-logM)<br />
* 空间复杂度:N+MM为桶的个数<br />
* 非原址排序<br />
* 稳定性:稳定<br />
*
* 桶排序假设数据会均匀入桶,在这个前提下,桶排序很快!
*/

public class BucketSort {

// 根据桶的个数来确定hash函数,这份代码适合桶的个数等于数组长度
static int hash(int element,int max,int length){
return (element * length)/(max+1);
}

private static void sort(int[] arr) {
int length = arr.length;
LinkedNode[] bucket = new LinkedNode[length]; // 桶的个数等于length
int max = arr[0]; // max
for (int i = 1; i < arr.length; i++) {
if (arr[i]>max) {
max = arr[i];
}
}
// 入桶
for (int i = 0; i < length; i++) {
int value = arr[i]; // 扫描每个元素
int hash = hash(arr[i], max, length); // 桶的下标
if (bucket[hash]==null) {
bucket[hash] = new LinkedNode(value); // 初始化链表
}else {
insertInto(value,bucket[hash],bucket,hash); // 插入链表
}
}
int k = 0; // 记录数组下标
// 出桶,回填arr
for(LinkedNode node:bucket){
if (node!=null) {
while(node!=null){
arr[k++] = node.value;
node = node.next;
}
}
}
}

private static void insertInto(int value, LinkedNode head, LinkedNode[] bucket, int hash) {
LinkedNode newNode = new LinkedNode(value);
// 小于头节点,放在头上
if (value<=head.value) {
newNode.next = head;
// 替换头节点
bucket[hash] = newNode;
return ;
}
// 往后找第一个比当前值大的节点,放在这个节点的前面
LinkedNode p = head;
LinkedNode pre = p;
while(p!=null&&value>p.value){
pre = p;
p = p.next;
}
if (p == null) { // 跑到末尾了
pre.next = newNode;
}else { // 插入prep之间
pre.next = newNode;
newNode.next = p;
}
}

public static void main(String[] args) {
int arr[] = new int[10];
for(int i=0;i<10;i++){
arr[i] = (int) ((Math.random()+1)*10);
}
System.out.println("排序前:"+Arrays.toString(arr));
sort(arr);
System.out.println("排序后:"+Arrays.toString(arr));
}
}

/**
* 简单单向链表的节点
*
*/

class LinkedNode {

public int value;
public LinkedNode next;

public LinkedNode(int value) {
this.value = value;
}

}

以上是关于桶排序和基数排序的主要内容,如果未能解决你的问题,请参考以下文章

桶排序和基数排序有啥区别?

八十五再探希尔排序,桶排序,计数排序和基数排序

基数排序就是这么容易

排序算法下——桶排序计数排序和基数排序

算法计数排序桶排序和基数排序详解

---------快排-----表排-----基数排序(桶排序)-----