桶排序之计数排序

简介: 桶排序之计数排序
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);
  }
}
相关文章
|
5月前
|
搜索推荐 算法 Java
桶排序就是这么容易
桶排序就是这么容易
32 0
|
5月前
|
搜索推荐 算法
计数排序就是这么容易
计数排序就是这么容易
22 0
|
6月前
|
存储 搜索推荐 算法
C++桶排序的实现
C++桶排序的实现
|
6月前
|
存储 搜索推荐 C++
C++计数排序的实现
C++计数排序的实现
|
6月前
|
机器学习/深度学习 算法 搜索推荐
C++018-C++桶排序及其应用
C++018-C++桶排序及其应用
C++018-C++桶排序及其应用
|
11月前
|
搜索推荐 算法
计数排序详解
计数排序详解
|
6月前
|
搜索推荐 BI
排序算法:非比较排序(计数排序)
排序算法:非比较排序(计数排序)
81 0
|
搜索推荐 算法
排序算法——计数排序(非比较排序)
​ 哈喽大家好,我是保护小周ღ,本期为大家带来的是排序算法中的计数排序,非常的有意思,值得学习而且计数排序是非交换排序,分享所有源代码,粘贴即可运行,保姆级讲述,包您一看就会,快来试试吧~ ​
108 0
|
算法 容器
计数排序与基数排序
计数排序与基数排序
152 0
|
人工智能 搜索推荐 算法
C/C++ 计数排序
计数排序是一种非基于比较的排序算法,该算法于1954年由提出。找出待排序的数组中最大和最小的元素统计数组中每个值为i的元素出现的次数,存入数组C的第i项对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加)反向填充目标数组:将每个元素i放在新数组的第C[i]项,每放一个元素就将C[i]减去1它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n + k)(其中k是整数的范围),快于任何比较排序算法。当然这是一种牺牲空间换取时间的做法,而且当O(k)&gt;......
138 0
C/C++ 计数排序