桶排序算法
桶排序算法是排序算法中最简单的一种排序方式,其主要思想是:
若要对数字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
五、算法评价
- 时间复杂度为O(M+N),这是一种非常快的排序算法,但是其在空间上有些浪费,尤其是对{1,2,1001}进行排序的时候,这是一种用空间换时间的做法;
- 这种的桶排序只是一种最简单的排序方式,真正的桶排序要比这个复杂的多。
六、BUG记录
- 当数组作为参数传递时传递的只是一个地址,因此,如果想用int length = sizeof(target_list)/4在函数里计算数组的长度是行不通的;
- 函数返回数组的方式往往采用值传递的方式,如在参数列表里添加一个数组,然后在该函数里修改该数组;