Quicksort给我们一个很好的O(nlogn);但是,我在想是否有一种方法可以对具有唯一值的数组进行排序,而该值比Quicksort更快?
答案 0 :(得分:2)
以下是一些最快的排序算法及其运行时间:
答案 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是所有这些的很好参考。