技数排序是非比较排序,桶排序的一种
时间复杂度:O(n),空间复杂度O(n)
用一个数组,记录每个值出现的次数。
另一个数字把记录的内容倾倒到此数组(桶)里。
不稳定的计数排序
import java.util.Arrays;
/**
* @Description 不稳定的计数排序
* @Author calvin
* @Date 2019/9/3 21:10
**/
public class CountSort {
public static void main(String[] args){
int[] arr = {2,4,2,3,7,1,1,0,0,5,6,9,8,5,7,4,0,9};
int[] result = sort(arr);
System.out.println(Arrays.toString(result));
}
private static int[] sort(int[] arr) {
int [] result = new int[arr.length];
int[] count = new int[10];
for(int i =0;i<arr.length;i++){
count[arr[i]]++;
}
System.out.println(Arrays.toString(count));
for(int i =0,j=0; i<count.length;i++){
while(count[i]-- >0)
result [j++] = i;
}
return result;
}
}
稳定的计数算法
import java.util.Arrays;
/**
* @Description 稳定的计数排序
* @Author calvin
* @Date 2019/9/3 21:10
**/
public class CountSort {
public static void main(String[] args){
int[] arr = {2,4,2,3,7,1,1,0,0,5,6,9,8,5,7,4,0,9};
int[] result = sort(arr);
System.out.println(Arrays.toString(result));
}
private static int[] sort(int[] arr) {
int [] result = new int[arr.length];
int[] count = new int[10];
for(int i =0;i<arr.length;i++){
count[arr[i]]++;
}
System.out.println(Arrays.toString(count));
// for(int i =0,j=0; i<count.length;i++){
// while(count[i]-- >0)
// result [j++] = i;
// }
for(int i=1;i<count.length;i++){
count[i]=count[i]+count[i-1];
}
System.out.println(Arrays.toString(count));
for(int i =arr.length -1;i>=0;i--){
result[--count[arr[i]]] =arr[i];
}
return result;
}
}
来源:https://blog.csdn.net/qq_28656707/article/details/100527819