package com.harrison.class05;
import java.util.Arrays;
// 桶排序是一个大思想,计数排序就是桶排序的一种
// 桶排序的弊端,跟数据样本强相关,是不基于比较的排序
// 如果数据量很大的话,比如大到几十亿个数据,这种排序方式就一点不经济了
public class Code02_CountSort {
public static void countSort(int[] arr) {
if(arr==null || arr.length<2) {
return ;
}
int max=Integer.MIN_VALUE;
// 遍历找到数组中的最大值,方便准备桶的个数
for(int i=0; i<arr.length; i++) {
max=Math.max(max, arr[i]);
}
int[] bucket=new int[max+1];
for(int i=0; i<arr.length; i++) {
bucket[arr[i]]++;
}
int i=0;
for(int j=0; j<bucket.length; j++) {
while(bucket[j]-->0) {
arr[i++]=j;
}
}
}
public static void comparator(int[] arr) {
Arrays.sort(arr);
}
public static int[] generateRandomArray(int maxSize, int maxValue) {
int[] arr = new int[(int) ((maxSize + 1) * Math.random())];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) ((maxValue + 1) * Math.random());
}
return arr;
}
public static int[] copyArray(int[] arr) {
if (arr == null) {
return null;
}
int[] res = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
res[i] = arr[i];
}
return res;
}
public static boolean isEqual(int[] arr1, int[] arr2) {
if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null)) {
return false;
}
if (arr1 == null && arr2 == null) {
return true;
}
if (arr1.length != arr2.length) {
return false;
}
for (int i = 0; i < arr1.length; i++) {
if (arr1[i] != arr2[i]) {
return false;
}
}
return true;
}
public static void printArray(int[] arr) {
if (arr == null) {
return;
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
public static void main(String[] args) {
int testTime = 500000;
int maxSize = 100;
int maxValue = 150;
boolean succeed = true;
for (int i = 0; i < testTime; i++) {
int[] arr1 = generateRandomArray(maxSize, maxValue);
int[] arr2 = copyArray(arr1);
countSort(arr1);
comparator(arr2);
if (!isEqual(arr1, arr2)) {
succeed = false;
printArray(arr1);
printArray(arr2);
break;
}
}
System.out.println(succeed ? "Nice!" : "Fucking fucked!");
int[] arr = generateRandomArray(maxSize, maxValue);
printArray(arr);
countSort(arr);
printArray(arr);
}
}
11-24
3198
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
11-10
368
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)