我需要帮助以这种特殊方式根据频率对 java 中的数组进行排序
Posted
技术标签:
【中文标题】我需要帮助以这种特殊方式根据频率对 java 中的数组进行排序【英文标题】:I need help sorting an array in java based on frequency in this one particular way 【发布时间】:2019-10-30 21:31:35 【问题描述】:需要帮助获取一个数组,计算频率,放入另一个数组,数组索引作为数字,单个值作为 Java 中的频率
您可以使用 n 的数组计数对范围为 1 到 n 的 m 个整数组成的大型数组进行排序 条目来计算数组中每个整数的出现次数。例如,考虑 下面的数组 A 包含 14 个整数,范围从 1 到 9(请注意,在这种情况下 m = 14 和 n = 9):
9 2 4 8 9 4 3 2 8 1 2 7 2 5
形成一个由 9 个元素组成的数组 count,使得 count[i-1] 包含 i 的次数 出现在要排序的数组中。因此,计数是
1 4 1 2 1 0 1 2 2
特别是,
count[0] = 1
因为 1 在 A 中出现一次。
count[1] = 4,因为 2 在 A 中出现了 4 次。
count[2]=1,因为 3 在 A 中出现一次。
count[3] =2,因为 4 在 A 中出现了 2 次。
使用count数组对原数组A进行排序。在函数中实现这个排序算法
public static void countingSort(int[] a, int n )
并根据m(数组a的长度)和n分析其最坏情况的运行时间。 调用countingSort()后,a必须是排序数组(不要将排序结果存储在a中) 临时数组)。
编辑: 这是我尝试过的
public static void countingSort1(int[] a, int n)
int [] temp = new int[n];
int [] temp2 = new int[n];
int visited = -1;
for (int index = 0; index < n; index++)
int count = 1;
for (int j = index +1; j < n; j++)
if(a[index] == a[j])
count++;
temp[j] = visited;
if (temp[index]!= visited)
temp[index] = count;
for(int i = 1; i < temp.length; i++)
if (temp[i] != visited)
System.out.println(" " +a[i] + " | " +temp[i]);
只是为了计算频率,但我认为我做错了
【问题讨论】:
分享你的尝试,一些代码 你必须通过计数排序来解决它吗?或者你只关心最终的数组? 1.创建一个包含 n 个元素的频率数组“farray”。并将其中的所有元素初始化为零。 2. 对于原始数组“a”的每个元素“x”,递增 farray[x]。注意:这适用于小的 n。但是可以说如果 n 类似于 2000000000 那么你将需要大量内存,很可能分配会失败temp2
是做什么用的?
@AKS "将其中的所有元素初始化为零" 不需要。该数组已被 Java 初始化为全零。
【参考方案1】:
类似下面的东西应该可以完成工作:
既然您已经知道最高值是多少,在您的示例 9 中, 创建一个包含九个元素空间的频率数组。 遍历您的输入数组并为您发现的每个值增加 频率数组中值的索引处的值加一 为索引创建一个计数器并用 0 初始化它 在嵌套循环中迭代您的频率数组并替换 输入数组中的值与频率数组的索引。复杂性的分析留给你
public static void countingSort(int[] a, int n )
//counting
int[] freq = new int[n];
for(int i = 0; i<a.length; i++)
freq[a[i]-1]++;
//sorting
int index = 0;
for(int i = 0; i< freq.length; i++)
for(int j = 0;j < freq[i];j++)
a[index++]= i+1;
System.out.println(Arrays.toString(a));
【讨论】:
以上是关于我需要帮助以这种特殊方式根据频率对 java 中的数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章