线性时间排序

本文探讨了比较排序算法的时间复杂度下限,通过决策树模型证明了最优秀的排序算法如快速排序的时间复杂度至少为O(nlogn)。同时,介绍了计数排序作为突破这一限制的一种方法,但其适用范围受限于辅助数列长度。文章通过一个计数排序的实例展示了其实现过程,但指出该算法在面对大规模数据和辅助空间需求时可能的局限性。
摘要由CSDN通过智能技术生成

这是算法导论的总结性文章。在学习过程中已经接触到了非常多的排序算法,在数据结构一课中也有具体的分类,不难发现即便被认为在某种程度上最高效最常用的随机快速排序算法时间复杂度也在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];
	}
}

但是计数排序的问题在于辅助数列的长度可能会很大,所以也会有一些优化与进阶的版本…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值