桶排序之计数排序

简介: 桶排序之计数排序
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);
  }
}
相关文章
|
9月前
|
搜索推荐 算法 Java
桶排序就是这么容易
桶排序就是这么容易
48 0
|
9月前
|
搜索推荐 算法
计数排序就是这么容易
计数排序就是这么容易
45 0
|
10月前
|
存储 搜索推荐 算法
C++桶排序的实现
C++桶排序的实现
|
10月前
|
存储 搜索推荐 C++
C++计数排序的实现
C++计数排序的实现
|
10月前
|
机器学习/深度学习 算法 搜索推荐
C++018-C++桶排序及其应用
C++018-C++桶排序及其应用
C++018-C++桶排序及其应用
|
搜索推荐 算法
计数排序详解
计数排序详解
|
10月前
|
存储 搜索推荐
常见排序算法原理——第三部分(桶排序、计数排序、基数排序)
常见排序算法原理——第三部分(桶排序、计数排序、基数排序)
|
搜索推荐 算法
归并排序 与 计数排序
归并排序 与 计数排序
|
算法 搜索推荐
归并排序与计数排序
归并排序与计数排序
87 0
|
算法 容器
计数排序与基数排序
计数排序与基数排序
171 0