sal*_*ter 5 sorting counting-sort
这是我的计数排序的两个实现
在这个非常简单的实现中,我所做的就是计算元素出现的次数,并在输出数组中插入与出现次数相同的次数。实施1
public class Simple
{
static int[] a = {5,6,6,4,4,4,8,8,8,9,4,4,3,3,4};
public static void main(String[] args)
{
fun(a);
print(a);
}
static void fun(int[] a)
{
int max = findMax(a);
int[] temp = new int[max+1];
for(int i = 0;i<a.length;i++)
{
temp[a[i]]++;
}
print(temp);
//print(temp);
int k = 0;
for(int i = 0;i<temp.length;i++)
{
for(int j = 0;j<temp[i];j++)
a[k++] = i;
}
print(a);
}
static int findMax(int[] a)
{
int max = a[0];
for(int i= 1;i<a.length;i++)
{
if(a[i] > max)
max = a[i];
}
return max;
}
static void print(int[] a)
{
for(int i = 0;i<a.length;i++)
System.out.print(a[i] + " ");
System.out.println("");
}
}
Run Code Online (Sandbox Code Playgroud)
实现2 在我在网上很多地方看到的这个实现中,您创建一个数组,说明存在多少个小于或等于该元素的元素,然后在该位置插入该元素。插入后,您会减少小于或等于该元素的元素数量,因为您已包含该元素。通过元素,该数组变为全零。正如您所看到的,与前一个实现相比,此实现相当复杂,并且我不确定为什么它在网上广泛流行。
public class NotVerySimple {
public static void main(String[] args) {
static int[] a = {5,6,6,4,4,4,8,8,8,9,4,4,3,3,4};
sort(a);
}
static void sort(int[] a)
{
int min = smallest(a);
int max = largest(a);
int[] A = new int[max - min + 1];
for(int i = 0;i<a.length;i++)
{
A[a[i] - min]++;
}
for(int i = 1;i<A.length;i++)
A[i] = A[i-1] + A[i];
int[] B = new int[a.length];
for(int i = 0;i<a.length;i++)
{
B[ A[a[i] - min] - 1 ] = a[i];
A[a[i] - min]--;
}
print(B);
}
static int smallest(int[] a)
{
int ret = a[0];
for(int i = 1;i<a.length;i++)
{
if(a[i] < ret)
ret = a[i];
}
return ret;
}
static int largest(int[] a)
{
int ret = a[0];
for(int i = 1;i<a.length;i++)
{
if(a[i] > ret)
ret = a[i];
}
return ret;
}
static void print(int[] a)
{
for(int x : a)
System.out.print(x+ " ");
}
}
Run Code Online (Sandbox Code Playgroud)
与第一个简单的实现相比,第二个复杂的实现是否有任何优势,使其如此受欢迎?
归档时间: |
|
查看次数: |
997 次 |
最近记录: |