カウントソートは、比較に基づかないソートアルゴリズムです。その利点は、特定の範囲内の整数をソートする場合、その複雑さがΟ(n + k)(kは整数の範囲)であり、どの比較ソートアルゴリズムよりも高速であるということです。もちろん、これは時間のためにスペースを犠牲にするアルゴリズムです。
基本的な考え方
カウントと並べ替えの基本的な考え方は、入力要素xごとに、x未満の要素の数を決定することです。たとえば、7つの要素がxより小さい場合、xは8番目の出力位置にある必要があります。
作業工程
- 準備:
入力配列:array
[1 ... n]。
出力配列:result
[1 ... n]。
配列を一時的に保存しcountArray
ます:[0 ... k]。 - 計算
array
の各要素の数を計算し、それをcountArray
配列に格納します。配列array
の要素の値をcountArray
配列の添え字として取得すると、配列array
のcountArray
対応する要素が+1になるたびに、配列の要素が1回繰り返されます。 - 配列
array
内の現在の要素より少ない数=countArray
現在の要素と配列内の前の要素の合計を計算します。そして、データをcountArray
配列に更新します countArray
決定によると、配列内の現在array
の要素は、配列内のresult
格納位置の配列内の要素の数よりも少ない。
コード
/**
* 计数排序
* @param array 待排序数组
* @param k 临时数组长度,取值为排序数组的最大值+1
* (此处是因为 array 中的元素被作为数组下标,所以数组长度为最大值+1)
*/
private static void countSort(int[] array, int k) {
//创建计数统计数组
int[] countArray = new int[k];
//计算 array 中每个元素的重复个数
for (int i = 0; i < array.length; i++) {
countArray[array[i]] += 1;
}
//计算数组中小于当前元素的元素个数
for (int i = 0; i < k; i++) {
if (i > 0) {
countArray[i] = countArray[i] + countArray[i - 1];
}
}
//结果输出数组
int[] result = new int[array.length];
//将 array 中的元素存放到 result 指定位置
for (int i = array.length - 1; i >= 0; i--) {
System.out.println("array:" + array[i] + " | countArray:" + countArray[array[i]]);
//计算存放位置(小于当前元素的数量值-1即为数组下标)
int pos = countArray[array[i]] -1;
//根据计数统计数组将数组array中的元素存放到result数组中
result[pos] = array[i];
//小于当前元素的数量值-1
countArray[array[i]] = pos;
}
System.out.println(Arrays.toString(result));
}
更新が遅れました、ハハ。カウントソートは一般的に使用されていないアルゴリズムのようですが、他の比較ソートと比較してアイデアは比較的単純であり、学ぶ価値があります。