这是算法导论的总结性文章。在学习过程中已经接触到了非常多的排序算法,在数据结构一课中也有具体的分类,不难发现即便被认为在某种程度上最高效最常用的随机快速排序算法时间复杂度也在O(nlogn)。这是为什么呢?
其实我们之前学到的算法都可以归类为比较排序算法,可以用决策树来表示出来,假设我们要对A1 A2 A3进行排序,小于走左子树,大于走右子树,就可以得到如下的决策树。
每一个叶子结点都是最后的结果,当规模变大的时候,决策树并不是一个简洁的表述方式,但是并不代表它一无是处,比如我们可以用来证明比较排序时间复杂度最低为nlogn。
叶子结点≤2h其中h为高度
叶子结点≥n!
n!≤2h
两边取对数 h≥lg(n!)
斯特林公式 h≥lg(n/e)n
h≥nlogn其中高度h就是时间复杂度(从根节点到叶子节点的路径)
所以有没有算法可以突破这个限制呢,我们习惯性的用空间换时间,这里也是一样,比如计数排序(我感觉就是一个哈希的用法)
int main() {
int array[] = { 2,1,3,4,2,5,8 };
int co = sizeof(array) / sizeof(array[0]);
int max = -1;
for (int i : array) {
max = i > max ? i : max;
}
int* count=new int[max + 1];
for (int i = 0; i < max+1; i++)count[i] = 0;
for (int i = 0; i < co;i++) {
count[array[i]]++;
}
int index=0;
int* res = new int[co];
for (int i = 0; i < max + 1; i++)res[i] = 0;
for(int i=0;i<max+1;i++){
while(count[i]>0){
res[index++]=i;
count[i]--;
}
}
for (int i = 0; i < co;i++) {
cout<<res[i];
}
}
但是计数排序的问题在于辅助数列的长度可能会很大,所以也会有一些优化与进阶的版本…