桶排序
时间复杂度:O(n)
空间复杂度:O(n+m)
【n为待排个数,m为桶的个数】
稳定
核心代码
import java.util.Arrays;
/**
* 桶排序
* @author jin
*
*/
public class BucketSort {
public static void main(String[] args) {
int[] a={3,6,1,22,2,5,4,3,7,0,9,8,3,5};
sort(a);
System.out.println(Arrays.toString(a));
}
public static void sort(int[] a) {
//求得原数组的最大值
int max = a[0];
for (int i = 0; i < a.length; i++) {
if (max <= a[i]) {
max = a[i];
}
}
if(a==null||max<1){
return;
}
/*
* 数组的索引是从0开始的
* 且bucket中的数值全为0
*/
int[] bucket = new int[max+1];
/*
* 放入桶中,索引为数字的值
* 如果有相同的值,则该索引对应的值+1
*/
for (int i = 0; i < a.length; i++) {
bucket[a[i]]++;
}
/*
* 进行排序
* 如果bucket中的元素不为0时
* 把bucket的索引给原数组,完成排序
*/
for (int i = 0, j = 0; i <bucket.length; i++) {
while ((bucket[i]--) > 0) {
a[j++] = i;
}
}
bucket=null;
}
}
桶排序是指把待排数值作为桶数组的索引,如果待排数字中有重复的,则对应的桶数值+1.
步骤:
(1)先找出原数组的最大值
int max=0;
for(int i=0;i<a.length;i++){
if(max<=a[i])
max=a[i];
}
(2)新建桶数组,且元素数值为0
int[] bucket=new int[max+1];
【桶的索引是从0开始的,如果数组长度只是max的话,数组索引只能到max-1,那么max就囊括不到】
(3)遍历原数组,当原数组数值与桶数组的索引相同的时候,桶索引对应的数值+1
for(int i=0;i<a.length;i++){
bucket[a[i]]++;
}
(4)对原数组进行排序,即把桶索引给原数组
for(int i=0,j=0;i<bucket.length;i++){
while((bucket[i]--)>0){
a[j++]=i;
}
}
补充:
(1)关于i++和++i
int i=10;
System.out.println(i++);//10
System.out.println(++i);//12
i++是先把 i 给一个变量,然后再自增,
++i是先自增,然后再把 i 给一个变量。
(2)关于i–和–i
int i=10;
System.out.println(i--);//10
System.out.println(--i);//8
i–是先把 i 给一个变量,然后再自减,
–i是先自减,然后再把 i 给一个变量。