计数排序
找到最大值,然后申请一个最大值+1大小的count数组。
使用count数组来对出现过的数字进行计数统计。此时count数组的索引就是排序好的数字。
遍历count数组,根据count数组的索引和出现的次数生成排序后的结果放入另一个数组中。
public static void main(String[] args) {
int[] a = {3, 9, 7, 2, 5, 8, 1, 4};
System.out.println(Arrays.toString(a));
sort(a);
System.out.println(Arrays.toString(a));
}
private static void sort(int[] a){
int max = Integer.MIN_VALUE;
for (int i = 0; i < a.length; i++) {
if(a[i] > max){
max = a[i];
}
}
int[] count = new int[max + 1];
for (int i = 0; i < a.length; i++) {
count[a[i]]++;
}
int i = 0;
int j = 0;
while(i < a.length){
if(count[j] == 0){
j++;
}
int t = count[j];
while(t > 0 && i < a.length){
a[i] = j;
t--;
i++;
}
j++;
}
}
桶排序
使用动态数组申请一个桶。
遍历原数组,通过除法找到动态数组索引放入数据。
对桶内元素排序,结果放回原数组中。
public static void main(String[] args) {
int[] a = {20, 18, 66, 25, 67, 30};
System.out.println(Arrays.toString(a));
sort(a,10);
System.out.println(Arrays.toString(a));
}
private static void sort(int[] a,int size){
List<List<Integer>> buckets = new ArrayList<>();
List<Integer> bucket = null;
for (int i = 0; i < size; i++) {
bucket = new ArrayList<>();
buckets.add(bucket);
}
for (int i : a) {
List<Integer> integerList = buckets.get(i / 10);
integerList.add(i);
}
int k = 0;
for (List<Integer> integerList : buckets) {
integerList.sort(Integer::compareTo);
for (Integer i : integerList) {
a[k++] = i;
}
}
}
基数排序
思想跟桶排序差不多,只不过是从最低位开始排序,通过循环排到最高位。
public static void radixSort(String[] a, int length) {
ArrayList<String>[] buckets = new ArrayList[128];
for (int i = 0; i < buckets.length; i++) {
buckets[i] = new ArrayList<>();
}
for (int i = length - 1; i >= 0 ; i--) {
for (String s : a) {
buckets[s.charAt(i) - "0"].add(s);
}
int k = 0;
for (ArrayList<String> bucket : buckets) {
for (String s : bucket) {
a[k++] = s;
}
bucket.clear();
}
}
}
public static void main(String[] args) {
String[] phoneNumbers = new String[10];
phoneNumbers[0] = "138";
phoneNumbers[1] = "139";
phoneNumbers[2] = "136";
phoneNumbers[3] = "137";
phoneNumbers[4] = "135";
phoneNumbers[5] = "134";
phoneNumbers[6] = "150";
phoneNumbers[7] = "151";
phoneNumbers[8] = "152";
phoneNumbers[9] = "157";
RadixSort.radixSort(phoneNumbers, 3);
for (String phoneNumber : phoneNumbers) {
System.out.println(phoneNumber);
}
}