按频率排序

时间:2018-01-14 14:01:18

标签: java sorting

我在其中一项任务中遇到了这个问题。我已经尝试找出解决方案几个小时,但似乎我做错了。

我需要按照数字的频率对数组进行排序,例如;

[ - 1.1,-1.1,2.4,-3.0,4.0,2.4,-1.1,-3.0] => [-1.1,-1.1, - 1.1,2.4,2.4,-3.0,-3.0,4.0]

[ - 0.5,4.0,6.5,6.5,4.0,-0.5] => [-0.5,-0.5,4.0,4.0,6.5,6.5]

我尝试过的,几乎可以工作的是创建一个名为count()的函数 此函数检查双数在数组中出现的时间,然后返回该数量。

然后我做了一个功能:

public static void sortByFreq(double [] arr)

    public static void sortByFreq(double[] arr)
{   
    double temp;
    for(int i = 0; i < arr.length; i++)
    {
        for(int j = 0; j < arr.length; j++)
        {

            if(count(arr, arr[i]) > count(arr, arr[j])) 
            {
// swap them if one of them appears more times(its count is bigger)
                    temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;

            }

        }

    }

    for(int i = 0; i < arr.length; i++) // print the numbers
    {
        System.out.print(arr[i] + " ");
    }


}

使用这种方法,我设法得到了一个不完整的答案,例如 - 第一个例子很好并正确打印。

第二个打印 [-0.5,4.0,6.5,6.5,4.0,-0.5] =&gt; [-0.5,4.0,6.5,6.5,4.0,-0.5]

正如您所看到的那样,4.0和6.5是混合的。我该如何解决这个问题?也许我应该尝试一些完全不同的东西?

编辑:我不知道如何使用链接列表,我不确定我们是否允许使用我们学到的东西。

2 个答案:

答案 0 :(得分:1)

一种策略是计算产生元素的2D数组的事件并对这个新数组进行排序。

对于2D数组,我声明了一个Element.java类

public class Element{ 

    public int count;
    public int index;
    public double val;

    public Element(int index, int count , double val){
        this.count = count;
        this.index = index;
        this.val = val;
    }

}

按频率对数组进行排序的主要算法如下所示

public static void sortByFrequency(double arr[]) {
    Element[] elements = new Element[arr.length];
    for (int i = 0; i < elements.length; i++)
        elements[i] = new Element(i,0,arr[i]);

    /* Count occurrences of remaining elements */
    for (int i = 0; i < arr.length; i++) {
        for(int j = 0; j < arr.length; j++){
            if(elements[i].val == elements[j].val)
                elements[i].count++;
        }
    }
    /* sort on the basis of count and in case of tie use index
    to sort.*/
    Arrays.sort(elements, new Comparator<Element>() {
        @Override
        public int compare(Element o1, Element o2) {
            if (o1.count > o2.count) return -1;
            else if (o1.count < o2.count) return 1;
            // tie breaker
            if(o1.count == o2.count ){
                if (o1.val > o2.val) return -1;
                else if (o1.val < o2.val) return 1;
            }
            return 0;
        }
    });

    for (int i = 0; i < arr.length; i++)
        arr[i] = elements[i].val;
}

答案 1 :(得分:0)

之所以会发生这种情况是因为您获得了两个频率相同的不同数如果频率相等,则必须比较数字本身。只需将if条件从排序更改为:

if(count(arr, arr[i]) >= count(arr, arr[j]) && arr[i] < arr[j]) {           
       temp = arr[i];
       arr[i] = arr[j];
       arr[j] = temp;
}