计数排序

107 阅读1分钟

计数排序适用于对在一定范围内的整数排序.时间复杂度是n+k,k为max-min

代码:

 public int[] countingSort(int[] arr, boolean reverse) {
    //计数排序
    int min = arr[0],
        max = arr[0],
        len = arr.length;
        
    // 1.求最大最小值,计算出差值d
    for (int i = 0; i < len; i++) {
      max = Math.max(arr[i], max);
      min = Math.min(arr[i], min);
    }
    int d = max - min;
    
    //2.创建统计数组,并统计对应元素个数    
    int[] countArray = new int[d + 1];
    for (int i = 0; i < len; i++) {
      int demp = reverse ? max - arr[i] : arr[i] - min;
      countArray[demp] += 1;
    }
    int sum = 0;
    //3.统计数组做变形,后面的元素等于前面的元素之和,也就是排名数组
    //countArray[i]的值即为原数组中对应排序位置
    for (int i = 0; i < d + 1; i++) {
      sum += countArray[i];
      countArray[i] = sum;
    }
    int[] res = new int[len];
    //4. 遍历原始数组, 从统计数组中找到原数组元素的排序位置, 输出到结果数组
    for (int i = 0; i < len; i++) {
       int demp = reverse ? max - arr[i] : arr[i] - min;
      res[countArray[demp] - 1] = arr[i];
      countArray[demp]--;
    }
    return res;
  }