桶排序

 

概要

本章介绍排序算法中的桶排序。内容包括:
1. 桶排序介绍
2. 桶排序图文说明
3. 桶排序实现
3.1  桶排序C实现
3.2  桶排序C++实现
3.3  桶排序Java实现

转载请注明出处:http://www.cnblogs.com/skywang12345/p/3602737.html


更多排序和算法请参考:数据结构与算法系列 目录

 

桶排序介绍

桶排序(Bucket Sort)的原理很简单,它是将数组分到有限数量的桶子里。

假设待排序的数组a中共有N个整数,并且已知数组a中数据的范围[0, MAX)。在桶排序时,创建容量为MAX的桶数组r,并将桶数组元素都初始化为0;将容量为MAX的桶数组中的每一个单元都看作一个"桶"。
在排序时,逐个遍历数组a,将数组a的值,作为"桶数组r"的下标。当a中数据被读取时,就将桶的值加1。例如,读取到数组a[3]=5,则将r[5]的值+1。

 

桶排序图文说明

桶排序代码

/*
 * 桶排序
 *
 * 参数说明:
 *     a -- 待排序数组
 *     n -- 数组a的长度
 *     max -- 数组a中最大值的范围
 */
void bucketSort(int a[], int n, int max)
{
    int i,j;
    int buckets[max];

    // 将buckets中的所有数据都初始化为0。
    memset(buckets, 0, max*sizeof(int));

    // 1. 计数
    for(i = 0; i < n; i++) 
        buckets[a[i]]++; 

    // 2. 排序
    for (i = 0, j = 0; i < max; i++) 
    {
        while( (buckets[i]--) >0 )
            a[j++] = i;
    }
}

bucketSort(a, n, max)是作用是对数组a进行桶排序,n是数组a的长度,max是数组中最大元素所属的范围[0,max)。

假设a={8,2,3,4,3,6,6,3,9}, max=10。此时,将数组a的所有数据都放到需要为0-9的桶中。如下图:

在将数据放到桶中之后,再通过一定的算法,将桶中的数据提出出来并转换成有序数组。就得到我们想要的结果了。

 

桶排序实现

桶排序C实现
实现代码(bucket_sort.c)

 1 /**
 2  * 桶排序:C 语言
 3  *
 4  * @author skywang
 5  * @date 2014/03/13
 6  */
 7 
 8 #include <stdio.h>
 9 #include <stdlib.h>
10 #include <string.h>
11 
12 // 数组长度
13 #define LENGTH(array) ( (sizeof(array)) / (sizeof(array[0])) )
14 
15 /*
16  * 桶排序
17  *
18  * 参数说明:
19  *     a -- 待排序数组
20  *     n -- 数组a的长度
21  *     max -- 数组a中最大值的范围
22  */
23 void bucket_sort(int a[], int n, int max)
24 {
25     int i, j;
26     int *buckets;
27 
28     if (a==NULL || n<1 || max<1)
29         return ;
30 
31     // 创建一个容量为max的数组buckets,并且将buckets中的所有数据都初始化为0。
32     if ((buckets=(int *)malloc(max*sizeof(int)))==NULL)
33         return ;
34     memset(buckets, 0, max*sizeof(int));
35 
36     // 1. 计数
37     for(i = 0; i < n; i++) 
38         buckets[a[i]]++; 
39 
40     // 2. 排序
41     for (i = 0, j = 0; i < max; i++) 
42         while( (buckets[i]--) >0 )
43             a[j++] = i;
44 
45     free(buckets);
46 }
47 
48 void main()
49 {
50     int i;
51     int a[] = {8,2,3,4,3,6,6,3,9};
52     int ilen = LENGTH(a);
53 
54     printf("before sort:");
55     for (i=0; i<ilen; i++)
56         printf("%d ", a[i]);
57     printf("\n");
58 
59     bucket_sort(a, ilen, 10); // 桶排序
60 
61     printf("after  sort:");
62     for (i=0; i<ilen; i++)
63         printf("%d ", a[i]);
64     printf("\n");
65 }
View Code

桶排序C++实现
实现代码(BucketSort.cpp)

 1 /**
 2  * 桶排序:C++
 3  *
 4  * @author skywang
 5  * @date 2014/03/13
 6  */
 7 
 8 #include <iostream>
 9 #include <cstring>
10 using namespace std;
11 
12 /*
13  * 桶排序
14  *
15  * 参数说明:
16  *     a -- 待排序数组
17  *     n -- 数组a的长度
18  *     max -- 数组a中最大值的范围
19  */
20 void bucketSort(int* a, int n, int max)
21 {
22     int i, j;
23     int *buckets;
24 
25     if (a==NULL || n<1 || max<1)
26         return ;
27 
28     // 创建一个容量为max的数组buckets,并且将buckets中的所有数据都初始化为0。
29     if ((buckets = new int[max])==NULL)
30         return ;
31     memset(buckets, 0, max*sizeof(int));
32 
33     // 1. 计数
34     for(i = 0; i < n; i++) 
35         buckets[a[i]]++; 
36 
37     // 2. 排序
38     for (i = 0, j = 0; i < max; i++) 
39         while( (buckets[i]--) >0 )
40             a[j++] = i;
41 
42     delete[] buckets;
43 }
44 
45 
46 int main()
47 {
48     int i;
49     int a[] = {8,2,3,4,3,6,6,3,9};
50     int ilen = (sizeof(a)) / (sizeof(a[0]));
51 
52     cout << "before sort:";
53     for (i=0; i<ilen; i++)
54         cout << a[i] << " ";
55     cout << endl;
56 
57     bucketSort(a, ilen, 10); // 桶排序
58 
59     cout << "after  sort:";
60     for (i=0; i<ilen; i++)
61         cout << a[i] << " ";
62     cout << endl;
63 
64     return 0;
65 }
View Code

桶排序Java实现
实现代码(BucketSort.java)

 1 /**
 2  * 桶排序:Java
 3  *
 4  * @author skywang
 5  * @date 2014/03/13
 6  */
 7 
 8 public class BucketSort {
 9 
10     /*
11      * 桶排序
12      *
13      * 参数说明:
14      *     a -- 待排序数组
15      *     max -- 数组a中最大值的范围
16      */
17     public static void bucketSort(int[] a, int max) {
18         int[] buckets;
19 
20         if (a==null || max<1)
21             return ;
22 
23         // 创建一个容量为max的数组buckets,并且将buckets中的所有数据都初始化为0。
24         buckets = new int[max];
25 
26         // 1. 计数
27         for(int i = 0; i < a.length; i++) 
28             buckets[a[i]]++; 
29 
30         // 2. 排序
31         for (int i = 0, j = 0; i < max; i++) {
32             while( (buckets[i]--) >0 ) {
33                 a[j++] = i;
34             }
35         }
36 
37         buckets = null;
38     }
39 
40     public static void main(String[] args) {
41         int i;
42         int a[] = {8,2,3,4,3,6,6,3,9};
43 
44         System.out.printf("before sort:");
45         for (i=0; i<a.length; i++)
46             System.out.printf("%d ", a[i]);
47         System.out.printf("\n");
48 
49         bucketSort(a, 10); // 桶排序
50 
51         System.out.printf("after  sort:");
52         for (i=0; i<a.length; i++)
53             System.out.printf("%d ", a[i]);
54         System.out.printf("\n");
55     }
56 }
View Code

上面3种实现的原理和输出结果都是一样的。下面是它们的输出结果:

before sort:8 2 3 4 3 6 6 3 9 
after  sort:2 3 3 3 4 6 6 8 9 

 

AI 代码审查Review工具 是一个旨在自动化代码审查流程的工具。它通过集成版本控制系统(如 GitHub 和 GitLab)的 Webhook,利用大型语言模型(LLM)对代码变更进行分析,将审查意见反馈到相应的 Pull Request 或 Merge Request 中。此外,它还支持将审查结果通知到企业微信等通讯工具。 一个基于 LLM 的自动化代码审查助手。通过 GitHub/GitLab Webhook 监听 PR/MR 变更,调用 AI 分析代码,将审查意见自动评论到 PR/MR,同时支持多种通知渠道。 主要功能 多平台支持: 集成 GitHub 和 GitLab Webhook,监听 Pull Request / Merge Request 事件。 智能审查模式: 详细审查 (/github_webhook, /gitlab_webhook): AI 对每个变更文件进行分析,旨在找出具体问题。审查意见会以结构化的形式(例如,定到特定代码行、问题分类、严重程度、分析和建议)逐条评论到 PR/MR。AI 模型会输出 JSON 格式的分析结果,系统再将其转换为多条独立的评论。 通用审查 (/github_webhook_general, /gitlab_webhook_general): AI 对每个变更文件进行整体性分析,为每个文件生成一个 Markdown 格式的总结性评论。 自动化流程: 自动将 AI 审查意见(详细模式下为多条,通用模式下为每个文件一条)发布到 PR/MR。 在所有文件审查完毕后,自动在 PR/MR 中发布一条总结性评论。 即便 AI 未发现任何值得报告的问题,也会发布相应的友好提示和总结评论。 异步处理审查任务,快速响应 Webhook。 通过 Redis 防止对同一 Commit 的重复审查。 灵活配置: 通过环境变量设置基
【直流微电网】径向直流微电网的状态空间建模与线性化:一种耦合DC-DC变换器状态空间平均模型的方法 (Matlab代码实现)内容概要:本文介绍了径向直流微电网的状态空间建模与线性化方法,重点提出了一种基于耦合DC-DC变换器的状态空间平均模型的建模策略。该方法通过数学建模手段对直流微电网系统进行精确的状态空间描述,对其进行线性化处理,以便于系统稳定性分析与控制器设计。文中结合Matlab代码实现,展示了建模与仿真过程,有助于研究人员理解和复现相关技术,推动直流微电网系统的动态性能研究与工程应用。; 适合人群:具备电力电子、电力系统或自动化等相关背景,熟悉Matlab/Simulink仿真工具,从事新能源、微电网或智能电网研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握直流微电网的动态建模方法;②学习DC-DC变换器在耦合条件下的状态空间平均建模技巧;③实现系统的线性化分析支持后续控制器设计(如电压稳定控制、功率分配等);④为科研论文撰写、项目仿真验证提供技术支持与代码参考。; 阅读建议:建议读者结合Matlab代码逐步实践建模流程,重点关注状态变量选取、平均化处理和线性化推导过程,同时可扩展应用于更复杂的直流微电网拓扑结构中,提升系统分析与设计能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值