本文内容是对桶排序的梳理和总结,本文内容包括:
排序算法十大经典方法
range= (max - min) / len + 1
,len为数据的个数,需要保证至少有一个桶,故而需要加个1
bucketCount = (max - min) / range + 1
,需要保证每个桶至少要能装1个数,故而需要加个1需求描述:现在有一组待排序的数字(如下图所示),要求通过桶排序升序排序。
第一步:创建桶
第二步:数据放入桶中
第三步:桶内排序
此时,元素已是有序的了
如果下图不动,点击这里查看在线的图解
public static void main(String[] args) {
int[] arr = {11, 38, 8, 34, 19, 26, 13};
bucketSort(arr);
System.out.println("排序后: " + Arrays.toString(arr));
}
public static void bucketSort(int[] arr) {
// 找出数组中的最大最小值
int len = arr.length;
int min = arr[0], max = arr[0];
for (int i = 1; i < len; i++) {
min = Math.min(min, arr[i]);
max = Math.max(max, arr[i]);
}
// 确定每个桶存储的范围
int range = (max - min) / len + 1; // 保证最少存储1个
// 确定桶的数量
int bucketCount = (max - min) / range + 1; // 保证桶的个数至少为1
// 初始化桶
int [][] buckets = new int[bucketCount][0]; // 声明bucketCount个桶
// 将待排序的数据放入到各自的桶中
for (int i = 0; i < len; i++) {
int index = (arr[i] - min) / range;
buckets[index] = arrAppend(buckets[index],arr[i]);
}
// 对各个桶中的数据进行排序
for (int i = 0; i < bucketCount; i++) {
insertSort(buckets[i]);
}
// 依次将各个桶中的数据放入返回数组中
int index = 0;
for (int i = 0; i < bucketCount; i++) {
for (int j = 0; j < buckets[i].length; j++) {
arr[index++] = buckets[i][j];
}
}
}
// 插入排序算法
public static int[] insertSort(int arr[]) {
for (int i = 1; i < arr.length; i++) {
int tmp = arr[i];
int j = i;
while (j > 0 && tmp < arr[j - 1]) {
arr[j] = arr[j - 1];
j--;
}
if (j != i) {
arr[j] = tmp;
}
}
return arr;
}
//自动扩容,并保存数据
public static int[] arrAppend(int arr[], int value) {
arr = Arrays.copyOf(arr, arr.length + 1);
arr[arr.length - 1] = value;
return arr;
}
powered by kaifamiao