桶排序之计数排序

简介: 桶排序之计数排序
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);
  }
}
相关文章
|
4月前
|
搜索推荐 算法 Java
桶排序就是这么容易
桶排序就是这么容易
29 0
|
4月前
|
搜索推荐 算法
计数排序就是这么容易
计数排序就是这么容易
18 0
|
5月前
|
存储 搜索推荐 算法
C++桶排序的实现
C++桶排序的实现
|
5月前
|
存储 搜索推荐 C++
C++计数排序的实现
C++计数排序的实现
|
5月前
|
机器学习/深度学习 算法 搜索推荐
C++018-C++桶排序及其应用
C++018-C++桶排序及其应用
C++018-C++桶排序及其应用
|
10月前
|
搜索推荐 算法
计数排序详解
计数排序详解
|
5月前
|
搜索推荐 BI
排序算法:非比较排序(计数排序)
排序算法:非比较排序(计数排序)
74 0
|
算法 容器
计数排序与基数排序
计数排序与基数排序
148 0
|
算法 搜索推荐 Java
基数排序(桶排序)算法
基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”
147 0
基数排序(桶排序)算法
|
算法 搜索推荐
桶排序
概念:桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。 桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排)。 桶排序最好情况下使用线性时间O(n),桶排序的时间复杂度,取决与对各个桶之间数据进行排序的时间复杂度,因为其它部分的时间复杂度都为O(n)。很显然,桶划分的越小,各个桶之间的数据越少,排序所用的时间也会越少。但相应的空间消耗就会增大。