Java程序计数排序

时间:2020-01-09 10:35:25  来源:igfitidea点击:

本教程显示了如何用Java编写计数排序程序。计数排序是一种整数排序算法。它不同于其他基于比较的算法,例如合并排序,选择排序,因为它不会通过比较值进行排序。在计数排序中,对每个元素的频率进行计数,并使用它来计算每个元素的最终位置。

使用计数排序时的限制之一是必须知道元素的范围(最大元素)。计数排序还需要额外的空间来存储元素的频率。

计数排序Java程序

public class CountingSort {
  public static void main(String[] args) {
    int[] arr = {10, 5, 15, 6, 12, 5, 8, 9, 0, 10, 1, 7};
    // Find the maximum element in the input array
    int max = findMaxElement(arr);
    System.out.println("Max Value in input array-" + max);
    System.out.println("Original Array- " + Arrays.toString(arr));
    int[] sortedArr = countingSort(arr, max+1);
    System.out.println("Sorted array after counting sort- " + Arrays.toString(sortedArr));
  }
	
  private static int findMaxElement(int[] arr) {
    int max = arr[0];
    for(int val : arr) {
      if (val > max)
        max = val;
    }
    return max;
  }
	
  private static int[] countingSort(int[] arr, int range){
    int[] result = new int[arr.length];
    int[] count = new int[range];
    //Calculate frequency of each element, put it in count array
    for(int i = 0; i < arr.length; i++){
        count[arr[i]]++;
    }
    System.out.println("Count array- " + Arrays.toString(count));
    
    // Modify count array to get the final position of elements
    for(int i = 1; i < range; i++){
        count[i] = count[i] + count[i-1];
    }
    System.out.println("Modified count array- " + Arrays.toString(count));
    
    // Add elements to output sorted array 
    for(int i = 0; i < arr.length; i++){
      result[count[arr[i]] - 1] = arr[i];
        count[arr[i]]--;
    }
    return result;
  }
}

输出:

Max Value in input array-15
Original Array- [10, 5, 15, 6, 12, 5, 8, 9, 0, 10, 1, 7]
Count array- [1, 1, 0, 0, 0, 2, 1, 1, 1, 1, 2, 0, 1, 0, 0, 1]
Modified count array- [1, 2, 2, 2, 2, 4, 5, 6, 7, 8, 10, 10, 11, 11, 11, 12]
Sorted array after counting sort- [0, 1, 5, 5, 6, 7, 8, 9, 10, 10, 12, 15]

计算排序时间和空间复杂度

如果要排序的元素数是N并且元素的范围是0到K,则第一个循环将迭代输入数组以获取计数数组,即O(n)。修改Count数组以获得步骤具有复杂度O(k)的最终位置。第三个循环再次迭代输入数组,因此该步骤的时间复杂度为O(n)。总计为O(2n + k),或者我们可以说Counting sort的时间复杂度为O(n + k),因为常量未使用Big O表示法进行计数。

计数数组占用k个空间,输出数组的长度与输入数组的长度相同,即N。因此,计数排序的空间复杂度为O(n + k)。