@Java
大家好,我是Ziph!
桶排序算法
用算法锻炼运算逻辑思维是一个好的想法,所以我初入算法,打算来锻炼我的运算逻辑思维!以后的日子也会研究一些简单的算法,给大家通俗易懂的解决办法!(争取让大家都能明白,小白也易懂)最起码我都能懂,比我聪明的你们研究一下更会懂得,哈哈!(滑稽)
什么是桶排序?
桶排序 (Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。当要被排序的数组内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n))。但桶排序并不是 比较排序,他不受到 O(n log n) 下限的影响。
桶排序称为最快的排序,因为他不用遍历多次,直接入桶便已经是排好的顺序,打印即可。缺点是有局限性,所谓的时间换空间吧!
关于桶排序的时间复杂度推导,即使数据不服从均匀分布,只有输入数据满足下列性质:所有桶的大小的平方和与总的元素数呈线性关系,那么桶排序仍然能在线性时间完成。
下面的解题方法的桶排序虽然有局限性,但是假如把数据装在集合里可以没有那么大的局限性。
在此先详解,后带来简单易懂的桶排序解决方案。
详解:
a[0]为0,表示“0”没有出现过,不打印
a[1]为0,表示“1”没有出现过,不打印
a[2]为1,表示“2”出现过1次,打印2
a[3]为1,表示“3”出现过1次,打印3
a[4]为0,表示“4”没有出现过,打印
a[5]为2,表示“5”出现过2次,打印5、5
a[6]为0,表示“6”没有出现过,不打印
a[7]为0,表示“7”没有出现过,不打印
a[8]为1,表示“8”出现过1次,打印8
a[9]为0,表示“9”没有出现过,不打印
a[9]为0,表示“10”没有出现过,不打印
最终打印结果就是:2、3、5、5、8
Java代码:
import java.util.Scanner;
/**
* @author Ziph(CSDN)
* @date 2020年2月14日
* @Email [email protected]
*/
public class BucketSort {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] a = new int[11];//创建11个桶
int i, j, t;
for (i = 1; i <= 5; i++) {//循环输入5个数
System.out.print("连续输入5个数(0~10):");
t = sc.nextInt();
if (t < 0 || t > 10) {//判断错误的校验
System.out.println("输入错误!");
System.exit(0);//退出程序
}
a[t]++;//进行计数
//例如:java中int[] a = new int[2]; a[0]=1;a[1]=5; a[0]++ 就是 a[0]=a[0]+1 就等于2
}
for (i = 0; i <= 10; i++) {//依次判断a[0]~a[10]
for (j = 1; j <= a[i]; j++) {//出现了几次就打印几次,打出断点的结果为:[0, 0, 1, 1, 0, 2, 0, 0, 1, 0, 0]
System.out.print(i + "\t");
}
}
}
}
执行结果:
我会继续学习算法,参透后继续分享…
有问题请留言回复!