如何对具有唯一值的数组进行排序

时间:2018-10-16 22:55:35

标签: algorithm sorting

Quicksort给我们一个很好的O(nlogn);但是,我在想是否有一种方法可以对具有唯一值的数组进行排序,而该值比Quicksort更快?

3 个答案:

答案 0 :(得分:2)

以下是一些最快的排序算法及其运行时间:

  • 合并排序:O(nlogn)
  • 提要:O(nlogn)
  • 堆排序:O(nlogn)
  • 基数排序:O(nk)
  • 计数排序:O(n + k)

答案 1 :(得分:0)

关于排序算法和技术,@ Bilal答案非常有帮助!

解决该问题的方法可以在O(N*log(N))中运行,但是由于删除了重复的值,因此进一步的计算会更少。

因此,想法是输入值并将其插入std::set中,这将自动删除重复的值,如果需要重复的值,则可以在从用户那里获取输入时存储它的计数!

示例代码如下:

int n,x;
set<int> st;
int cnt[MAX_VAL];
int main(){
    cin>>n;
    for (int i=1;i<=n;i++){
        cin>>x;
        cnt[x]++;
        st.insert(x);
    }
    // Rest of your code
}

答案 2 :(得分:0)

在没有其他假设的情况下,使用比较的任何算法的最坏时间复杂度的下限为BigTheta(nlogn)。请注意,排列的排序实际上将是p的倒数。这意味着,如果您能够对p({1,2,... n)进行排序,则可以确定所有可能的排列中对数据应用了哪个排列。

排列的总数为n !,对于获取的每个信息位,您的集合都分为两组,分别表示与该位一致的结果。因此,您可以表示要使用哪种排列作为二叉树的搜索,其中每个节点是一组排列,节点的子代是父集的分区,叶子是算法的结果。

如果算法确定使用哪个分区,则叶子为单例,因此最终得到n!树叶。包含n的最小高度的树! leaves是log(n!),渐近为nlog(n)。 http://lcm.csa.iisc.ernet.in/dsa/node208.html是所有这些的很好参考。