线性排序
初步代码实现:不稳定排序
/**
* @Author: subd
* @Date: 2019/8/26 7:26
* @descrition 计数排序
*/
public class CountSort {
public static int[] countSort(int[] array) {
//1.得到数列的最大值
int max = array[0];
for (int i = 0; i < array.length; i++) {
if (array[i] > max) {
max = array[i];
}
}
//2.根据数列的最大值确定统计数组的长度
int[] countArray = new int[max + 1];
//3.遍历数列,填充统计数组
for (int i = 0; i < array.length; i++) {
countArray[array[i]]++;
}
//4.遍历统计数组,输出结果
int index = 0;
int[] sortedArray = new int[array.length];
for (int i = 0; i < countArray.length; i++) {
for (int j = 0; j < countArray[i]; j++) {
sortedArray[index++] = i;
}
}
return sortedArray;
}
public static void main(String[] args) {
int[] array = new int[]{4, 4, 6, 5, 3, 2, 8, 1, 7, 5, 6, 0, 10};
int[] sortedArray = countSort(array);
System.out.println(Arrays.toString(sortedArray));
}
}
代码实现2:稳定排序
/**
* @Author: subd
* @Date: 2019/8/26 7:41
* @descrition 计数排序
*/
public class CountSort2 {
public static int[] countSort(int[] array) {
//1.得到数列的最大值,并计算出差值d
int max = array[0];
int min = array[0];
for (int i = 0; i < array.length; i++) {
if (array[i] > max) {
max = array[i];
}
if (array[i] < min) {
min = array[i];
}
}
int d = max - min;
//2.创建统计数组并对统计对应元素的个数。
int[] countArray = new int[d + 1];
for (int i = 0; i < array.length; i++) {
countArray[array[i] - min]++;
}
//3.统计数组做变形,后面的元素等于前面的元素之和
for (int i = 1; i < countArray.length; i++) {
countArray[i] += countArray[i - 1];
}
//4.倒序遍历原始数列,从统计数组找到正确位置,输出到结果数组
int[] sortedArray = new int[array.length];
for (int i = array.length - 1; i >= 0; i--) {
sortedArray[countArray[array[i] - min] - 1] = array[i];
countArray[array[i] - min]--;
}
return sortedArray;
}
public static void main(String[] args) {
int[] array = new int[]{95,94,91,98,99,90,99,93,91,92};
int[] sortedArray = countSort(array);
System.out.println(Arrays.toString(sortedArray));
}
}
计数排序算法解析
本文深入探讨了计数排序算法的两种实现方式:不稳定排序和稳定排序。通过具体代码示例,详细解释了如何确定最大值,创建统计数组,以及如何通过遍历和填充统计数组来实现排序过程。适合对排序算法感兴趣的读者。
2304

被折叠的 条评论
为什么被折叠?



