java - 我需要帮助以这种特殊方式根据频率对 java 中的数组进行排序
问题描述
需要帮助获取一个数组,计算频率,放入另一个数组,数组索引作为数字,单个值作为 Java 中的频率
您可以使用包含 n 个条目的数组计数来计算数组中每个整数出现的次数,从而对范围为 1 到 n 的 m 个整数组成的大型数组进行排序。例如,考虑以下由 14 个整数组成的数组 A,范围从 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 必须是排序数组(不要将排序结果存储在临时数组中)。
编辑:这是我尝试过的
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]);
}
}
只是为了计算频率,但我认为我做错了
解决方案
像下面这样的东西应该可以完成工作:
- 由于您已经知道最高值是多少,在您的示例 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));
}
推荐阅读
- javascript - 单击鼠标滚轮后删除 :focus 及其样式
- c# - 用这个访问 c# 中的单例类;
- swiftui - 如何在 SwiftUI 中屏蔽/剪辑图像的底部?
- python - 如何有效地对子数组进行操作,例如计算行列式,逆,
- html - 是否可以包装一个
- reactjs - 我使用 React 和 PHP 制作的联系表返回 mailSent: false
- mariadb - 我可以在集群上使用主从复制吗?
- android - 如何在没有中间 toString 的情况下将 JSONObject 直接转换为 byteArray?
- android - Android,是否使用包装器执行功能
- abap - SAP ABAP - 尚未分配字段符号