0083 不用比较元素大小也能排序——计数排序算法实现与分析

mac2026-06-06  6

package sort; public class CountSorting { public static void countSort(int[] nums){ if (null == nums || nums.length < 2) return; int min = Integer.MAX_VALUE; int max = Integer.MIN_VALUE; //找数组的最大值和最小值 for (int num: nums){ if (num < min) min = num; if (max < num) max = num; } int[] ans = new int[max - min + 1];//构造能放[min,max]的连续数值数组; //统计每个位置有多少元素 for (int i = 0; i < nums.length; i++){ ans[nums[i] - min]++; } int k = 0; //依次将ans不为0的下标加min复制到nums,nums即为有序数组 for (int h = 0; h < ans.length; h++){ while (ans[h] > 0){//处理nums中重复的元素,当ans[i]计数为0时退出 nums[k++] = h + min;//此处下标+min ans[h]--; //nums中添加了一个元素,ans计数值就减1 } } } //最好情况:所有元素重复,T(n) = 2n(比较)+ n (统计) + n (判断) = 4n = O(n) //此时空间复杂度为O(1) //最坏情况:所有元素均不相同,假设k=max-min(数值范围) // T(n)=2n(比较)+n(统计)+k(判断) = 4n = O(n),空间复杂度:O(k) //平均时间复杂度:O(n+k) ,空间复杂度为:O(k),稳定算法,适合数组范围限定且不大的情况。 public static void main(String[] args){ int[] nums = {2,0,1,9,1,0,2,8}; countSort(nums); for (int num: nums) System.out.print(num+" "); } }

 

最新回复(0)