小算法
计数排序
问题概述:
利用数组下标进行元素排序
思路:
创建一个辅助数组,利用下标自然有序的特性进行排序
最好的情况下时间复杂度可以是线性的
package SortTest;
/**
* 计数排序
* 需要提前知道元素的大致范围,创建一个新的辅助数组大小恰好可以为原数组max+1
* 之后按照下标向辅助数组中放元素
* 最后遍历辅助数组输出(还需遍历每位直至其下标对应的元素为0)即可
*/
public class CountSortTest {
public static void main(String[] args) {
int[] T = {99,93,95,94,99,91,92,97,98,91,93,96,95,93,94,90,100,99,97,99};
int max = getMax(T);
int[] countSort = countSort(T, max);
print(countSort);
System.out.println();
//以上便为普通的计数排序,可以发现max=100,min=90,
// 这样创建一个长度为101的数组且前90个位置都浪费了,故进行改进
int min = getMin(T);
int[] sort2 = countSort2(T, min, max);
print2(sort2,min);
}
public static int getMin(int[] T){
int min = T[0];
for (int i = 0; i<T.length;i++){
min = (min>T[i]?T[i]:min);
}
return min;
}
public static int getMax(int[] T){
int max = T[0];
for (int i = 0; i<T.length;i++){
max = max>T[i]?max:T[i];
}
return max;
}
public static int[] countSort(int[] T,int max){
int[] countArry = new int[max+1];
for(int i = 0;i<T.length;i++){
countArry[T[i]]++;
}
return countArry;
}
public static int[] countSort2(int[] T,int min ,int max){
int mid = max - min;
int[] countArry = new int[mid+1];
for(int i = 0;i<T.length;i++){
countArry[T[i]-min]++;
}
return countArry;
}
public static void print2(int[] T,int min){
for(int i = 0; i<T.length;i++){
for (int j = 1; j <= T[i]; j++) {
System.out.print((i+min)+" ");
}
}
}
public static void print(int[] T){
for(int i = 0; i<T.length;i++){
for (int j = 1; j <= T[i]; j++) {
System.out.print(i+" ");
}
}
}
}
生活祝愿:昨天刚刚养了一周的小泰迪因为细小病毒离开了这个世界,我想在这里希望天堂没有病魔,小狗能一直快乐o(╥﹏╥)o