繁体   English   中英

对不同子数组中数组内的重复项进行排序

[英]Sort duplicates inside array in different sub arrays

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

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);  
}

我将按以下方式处理:

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

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)

我将按照以下方式进行处理。

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

  2. 现在以有序的方式遍历树,并继续将元素(具有count > 0 )放入数组中,并将其数量减少1。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM