排序算法_桶排序(算法设计与C代码实现)

桶排序算法

桶排序算法是排序算法中最简单的一种排序方式,其主要思想是:

若要对数字2,6,4,4,6,8进行排序,需要设置一个排好序的8个桶,然后将数字逐个丢进对应的桶中。按桶的顺序逐个捡起数字后,数字也就排好序了。

道理都很简单,这里着重使用C语言对此算法进行重现。

一、问题描述

       将一个数组中的数字进行排序处理,并返回一个排好序的新数组。

二、问题分析

算法:排序算法_桶排序
步骤:
(1)找到目标数组中的最大值,根据最大值新建一个数组,新建的数组称之为排好序的桶;
(2)遍历目标数组,并在桶数组对应的位置上标记加1;
(3) 遍历桶数组,依次记下标记过的位置,并返回位置序列。

三、代码实现

1. 获取数组中的最大值
int getMaxnumber(const int target_list[], int length){
    //获取目标序列中的最大数字
    int maxNumber = target_list[0];
    for(int i = 0; i<length; i++){
        if(maxNumber < target_list[i])
            maxNumber = target_list[i];
    }
    return maxNumber;
}
2. 获取数组的长度
    int target_list[6] = {5,4,3,5,16,8};
    int length = sizeof(target_list)/4;

四、源码

main.c

#include <stdio.h>
#include "bucketSort.h"

int main() {
    int target_list[6] = {5,4,3,5,16,8};
    int length = sizeof(target_list)/4;
    int q[length];
    bucketSort(target_list,length,q);
    for (int i = 0; i < 6; ++i) {
        printf("%d  ",q[i]);
    }
    return 0;
}

bucketSort.h

#ifndef SORTINGALGORITHM_BUCKETSORT_H
#define SORTINGALGORITHM_BUCKETSORT_H

//获取目标序列中的最大数字
int getMaxnumber(const int target_list[], int length){
    int maxNumber = target_list[0];
    for(int i = 0; i<length; i++){
        if(maxNumber < target_list[i])
            maxNumber = target_list[i];
    }
    return maxNumber;
}

//桶排序(返回正排序数组)
void bucketSort(const int target_list[], int length, int result_list[]){
    int maxNumber = getMaxnumber(target_list, length);      //获取目标数组中的最大数字
    int bucket_list[maxNumber + 1];                 //构建桶数组
    for (int i = 0; i < maxNumber + 1; ++i) {       //桶数组的初始化
        bucket_list[i] = 0;
    }
    for(int i = 0; i<length; i++){                  //向桶里丢入对应的数字
        if(target_list[i]>=0)
            bucket_list[target_list[i]]++;
    }
    for(int i = 0, k = 0; i < maxNumber + 1; i++){  //从桶中捡出数字到结果数组
        if(bucket_list[i] != 0){
            for (int j = 0; j < bucket_list[i]; ++j) {
                result_list[k] = i;
                k++;
            }
        }
    }
}
#endif //SORTINGALGORITHM_BUCKETSORT_H

五、算法评价

  1. 时间复杂度为O(M+N),这是一种非常快的排序算法,但是其在空间上有些浪费,尤其是对{1,2,1001}进行排序的时候,这是一种用空间换时间的做法;
  2. 这种的桶排序只是一种最简单的排序方式,真正的桶排序要比这个复杂的多。

六、BUG记录

  1. 当数组作为参数传递时传递的只是一个地址,因此,如果想用int length = sizeof(target_list)/4在函数里计算数组的长度是行不通的;
  2. 函数返回数组的方式往往采用值传递的方式,如在参数列表里添加一个数组,然后在该函数里修改该数组;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值