【问题标题】:Sort duplicates inside array in different sub arrays对不同子数组中的数组内的重复项进行排序
【发布时间】:2013-08-18 00:43:33
【问题描述】:

我有一个包含以下格式的重复项的数组:

arr[]={ 2,9,1,5,1,4,9,7,2,1,4 }  

我想对数组进行排序,以便所有重复的元素都移到最后并在不同的子数组中排序,如下所示:

arr[]={ 1,2,4,5,7,9, 1,2,4,9, 1 }  

指定数组的整数没有范围。 以下是我尝试过的代码。此代码递归地对子数组进行排序,然后将重复项移到最后。但在复杂性方面,这不是最佳解决方案。
请建议是否可以在O(n)O(nlogn) 解决。整个代码如下:

public static int sortDuplicates(int a[],int start,int end){           
    int i, k,temp;
    if(start==end)
        return 1;
    Arrays.sort(a, start, end);
    k = start;
    for (i = start+1; i < end; i++) {
        if (a[k] != a[i] && a[k]<a[i]) 
        {
           temp=a[k+1];
            a[k+1] = a[i];
            a[i]=temp;
           k++;
        }
    }       
    return sortDuplicates(a,k+1,a.length);  
}

【问题讨论】:

  • 这是java吗?如果是,请添加 java 标签。
  • 为什么7 在最后而不是在5 之后?
  • 最后一个数字 {1,2,4,5,9,1,2,4,9,1,7} 是什么意思? 1 不应该是最后一个数字 {1,2,4,5,7,9,1,2,4,9,1} 吗?
  • 致所有编辑:请注意不要引入比您的前任修复的错误更多...
  • 是的,我只是复制了某人的工作。 OP 一定有正在进行的工作并被覆盖。固定。

标签: java arrays sorting


【解决方案1】:

我会这样处理它。

  1. 将所有元素及其计数放入平衡二叉搜索树中。

  2. 现在以一种有序的方式遍历树,并继续将元素(带有count &gt; 0)放入数组中,并将它们的计数减1。

  3. 创建树的时间复杂度为O(nlgn),从树中放入元素的时间复杂度为O(n),空间复杂度为O(n)

问题是如果没有元素被重复,那么我们创建树是徒劳的。

【讨论】:

    【解决方案2】:

    我会这样处理它:

    将所有元素及其计数放入哈希图中:

    int[] arr={ 2,9,1,5,1,4,9,7,2,1,4 };
    Map<Integer, Integer> map = new HashMap<>();
    for (int elt : arr) {
        int val = 1;
        if (map.containsKey(elt))
            val = map.get(elt) + 1;
        map.put(elt, val);
    }
    

    一一获取批次:

    List<Integer> result = new ArrayList<>();
    while (map.size() > 0) {
        List<Integer> subList = new ArrayList<>();     // for the current segment
        Iterator<Integer> it = map.keySet().iterator();
        while (it.hasNext()) {
            int elt = it.next();
            subList.add(elt);
            if (map.get(elt) == 1) { // remove all elements with occurence = 1
                it.remove();       
            } else {                 // reduce occurence by 1
                map.put(elt, map.get(elt)-1);
            }
        }
        Collections.sort(subList);  // sort this segment
        result.addAll(subList);     // append to result
    }
    
    for (int i : result) {
        System.out.print(i + " ");
    }
    

    这会打印出来

    1 2 4 5 7 9 1 2 4 9 1 
    

    如果我没记错的话,它运行在O(n log n)

    【讨论】:

    • 这似乎不是就地算法
    • @Bergi 啊,是的,我完全错过了这个要求。我的猜测是就地算法不能比O(n^2) 做得更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    • 2011-12-15
    • 2022-11-01
    • 2023-02-24
    • 2020-11-19
    相关资源
    最近更新 更多