我需要帮助以这种特殊方式根据频率对 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 中的数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章

我想要一些关于如何根据元素频率对列表进行排序的帮助[重复]

是否可以根据频率以编程方式编辑声音文件?

如何根据需要调整背景图像的大小

AurioTouch2声音频率

尝试使用 OpenCV 捕获显示输出以进行实时分析;我需要与操作系统交互以进行输入的帮助

url 中的特殊字符 % # & = ? / + 无法被后端解析问题分析及解决方法