桶排序(C&Java语言实现)
坚持每天一算法,相信自己算法能取得长足的进步,记录一下今天学习的算法,最快最简单的排序--桶排序。
本片博客使用了两种IDE,分别是:
C:CLion
Java: IDEA
先来一个简介:
桶排序 (Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。
桶排序是鸽巢排序的一种归纳结果。当要被排序的数组内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n))。但桶排序并不是 比较排序,他不受到 O(n log n) 下限的影响。
桶排序是一个非常快的排序算法,也算一个牺牲空间换取时间的代表算法了,
这里我简要谈一下我的理解,当然只是浅显的了解。
桶排序将待排序的数据范围映射成一个个“桶”,如数据范围为 0 到 10 则对应着 11 个桶,当需要对范围内的数据进行排序时,读入待排序的数据,该数据对应的值就对应范围内的第几个“桶”,当读到一个数据,就让对应位置“桶”的数值增加 1 ,按照此步骤一个个数据读入,读完全部数据。
“桶”中的数就代表该位置的数据出现的次数,直接按照次数打印该数据即可。
桶排序利用函数的映射关系,减少了几乎所有的比较工作。
接下来用C语言和Java实现数据范围为 0-1000 的桶排序算法。
1、C语言实现桶排序算法(范围0-1000)
//
// Created by czc on 2019/8/13.
//
#include<stdio.h>
int main(){
int book[1001],i,j,t,n;
for(i=0;i<=1000;i++){
book[i]=0; //初始化为0
}
printf("请输入排序数据个数: ");
scanf("%d",&n); //
//循环读入n个数
for(i=1;i<=n;i++){
scanf("%d",&t);
book[t]++;
}
for(i=0;i<=1000;i++){
for(j=1;j<=book[i];j++){
printf("%d",i);
printf("%s"," ");
}
}
return 0;
}
下面是运行结果:
2、Java实现桶排序(范围0-1000)
import java.util.Scanner;
import static java.lang.System.out;
/*
创建人:czc
创建时间:2019/8/13
用途:Java实现桶排序算法
*/
public class BucketSort {
private static Scanner scanner;
private static int N=0;
public static void main(String[] args){
int[] book=new int[1001];
int i,j,t;
//循环读入五个数
out.println("请输入排序数据个数:");
scanner=new Scanner(System.in);
N=scanner.nextInt();
for(i=1;i<=N;i++){
t=scanner.nextInt();
book[t]++;
}
//依次判断book[0]-book[10]出现的次数并打印
for(i=0;i<=1000;i++){
for(j=1;j<=book[i];j++){
out.print(i+" ");
}
}
}
}
下面是运行结果:
这里CLion在输出中文时会出现乱码,参考网络上的博客才解决了问题,特此感谢,附上博客链接:https://blog.csdn.net/Cbk_XLL/article/details/78752534
吾生也有涯,而知也无涯。