非比较排序——桶排序

这一生的挚爱 提交于 2020-01-07 14:27:54

1、基本思想
划分多个范围相同的区间,每个自区间自排序,最后合并。
桶排序是计数排序的扩展版本,计数排序可以看成每个桶只存储相同元素,而桶排序每个桶存储一定范围的元素,通过映射函数,将待排序数组中的元素映射到各个对应的桶中,对每个桶中的元素进行排序,最后将非空桶中的元素逐个放入原序列中。
桶排序需要尽量保证元素分散均匀,否则当所有数据集中在同一个桶中时,桶排序失效。
不同的桶排序原理一样,主要区别于桶里面的排序类型
2、动画演示
在这里插入图片描述3、代码演示

package sort;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;

public class BucketSort {
	public static void main(String[] args) {
		int[] arr = { 2, 4, 3, 1, 6, 7, 5, 9, 8 };
		bucketSort(arr);
		System.out.println(Arrays.toString(arr));
	}
	private static void bucketSort(int[] arr) {
		//计算最大值与最小值
		int max=arr[0];
		int min=arr[0];
		for(int i=0;i<arr.length;i++){
			max=Math.max(max, arr[i]);
			min=Math.min(min, arr[i]);
		}
		//计算桶的数量
		int bucketNum=(max-min)/arr.length+1;
		//桶是一个数组,数组里面存的类型依然是数组
		ArrayList<ArrayList<Integer>> bucketArr=new ArrayList<>(bucketNum);
		//遍历桶,对每个桶加数组
		for(int i=0;i<bucketNum;i++){
			bucketArr.add(new ArrayList<Integer>());
		}
		//黄内阁天涯不属于放入桶里
		for(int i=0;i<arr.length;i++){
			//计算出元素对应的桶序号
			int num=(arr[i]-min)/arr.length;
			bucketArr.get(num).add(arr[i]);
		}
		//对每个桶进行排序
		for(int i=0;i<bucketArr.size();i++){
			Collections.sort(bucketArr.get(i));
		}
		//将桶中的元素赋值给原序列
		int index=0;
		//遍历桶数组
		for(int i=0;i<bucketArr.size();i++){
			//遍历每个桶里面的数组
			for(int j=0;j<bucketArr.get(i).size();j++){
				//进行赋值
				arr[index++]=bucketArr.get(i).get(j);
			}
		}		
	}	
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!