risc-v中文社区

 找回密码
 立即注册
查看: 1190|回复: 0

[原创] 桶排序

[复制链接]

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
发表于 2021-10-28 08:33:32 | 显示全部楼层 |阅读模式
桶排序
时间复杂度: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) {
                max = a;
            }
        }

        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]++;
        }

        /*
         * 进行排序
         * 如果bucket中的元素不为0时
         * 把bucket的索引给原数组,完成排序
         */
        for (int i = 0, j = 0; i <bucket.length; i++) {
            while ((bucket--) > 0) {
                a[j++] = i;
            }
        }
        bucket=null;
    }

}

桶排序是指把待排数值作为桶数组的索引,如果待排数字中有重复的,则对应的桶数值+1.
步骤:
(1)先找出原数组的最大值

int max=0;
for(int i=0;i<a.length;i++){
    if(max<=a)
    max=a;   
}
1
2
3
4
5
(2)新建桶数组,且元素数值为0

int[] bucket=new int[max+1];
1
【桶的索引是从0开始的,如果数组长度只是max的话,数组索引只能到max-1,那么max就囊括不到】
(3)遍历原数组,当原数组数值与桶数组的索引相同的时候,桶索引对应的数值+1

for(int i=0;i<a.length;i++){
    bucket[a]++;
}
1
2
3
(4)对原数组进行排序,即把桶索引给原数组

for(int i=0,j=0;i<bucket.length;i++){
    while((bucket--)>0){
        a[j++]=i;
    }
}
1
2
3
4
5
补充:
(1)关于i++和++i

int i=10;
System.out.println(i++);//10
System.out.println(++i);//12
1
2
3
i++是先把 i 给一个变量,然后再自增,
++i是先自增,然后再把 i 给一个变量。
(2)关于i–和–i

int i=10;
System.out.println(i--);//10
System.out.println(--i);//8
1
2
3
i–是先把 i 给一个变量,然后再自减,
–i是先自减,然后再把 i 给一个变量。
————————————————
版权声明:本文为CSDN博主「Levi_moon」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Levi_moon/article/details/51569203
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



Archiver|手机版|小黑屋|risc-v中文社区

GMT+8, 2024-5-3 22:24 , Processed in 0.014723 second(s), 17 queries .

risc-v中文社区论坛 官方网站

Copyright © 2018-2021, risc-v open source

快速回复 返回顶部 返回列表