为什么比较排序时间复杂度是O(nlogN)
2011-08-02 16:19
357 查看
在树的大部分操作中,我们首先
只用到比较的排序算法最低时间复杂度是O(nlogn),而像桶排这样的只需要O(R)(R为桶的大小)
为了证明只用到比较的排序算法最低时间复杂度是O(nlogn),首先要引入决策树。
首先,决策树是一颗二叉树,每个节点表示元素之间一组可能的排序,它予以京进行的比较相一致,比较的结果是树的边。
先来说明一些二叉树的性质,令T是深度为d的二叉树,则T最多有2^片树叶。具有L片树叶的二叉树的深度至少是logL。所以,对n个元素排序的决策树必然有n!片树叶(因为n个数有n!种不同的大小关系),所以决策树的深度至少是log(n!),即至少需要log(n!)次比较。
而 log(n!)=logn+log(n-1)+log(n-2)+...+log2+log1 >=logn+log(n-1)+log(n-2)+...+log(n/2) >=(n/2)log(n/2) >=(n/2)logn-n/2 =O(nlogn)
所以只用到比较的排序算法最低时间复杂度是O(nlogn)。
只用到比较的排序算法最低时间复杂度是O(nlogn),而像桶排这样的只需要O(R)(R为桶的大小)
为了证明只用到比较的排序算法最低时间复杂度是O(nlogn),首先要引入决策树。
首先,决策树是一颗二叉树,每个节点表示元素之间一组可能的排序,它予以京进行的比较相一致,比较的结果是树的边。
先来说明一些二叉树的性质,令T是深度为d的二叉树,则T最多有2^片树叶。具有L片树叶的二叉树的深度至少是logL。所以,对n个元素排序的决策树必然有n!片树叶(因为n个数有n!种不同的大小关系),所以决策树的深度至少是log(n!),即至少需要log(n!)次比较。
而 log(n!)=logn+log(n-1)+log(n-2)+...+log2+log1 >=logn+log(n-1)+log(n-2)+...+log(n/2) >=(n/2)log(n/2) >=(n/2)logn-n/2 =O(nlogn)
所以只用到比较的排序算法最低时间复杂度是O(nlogn)。
相关文章推荐
- 基于比较的排序,时间复杂度下界是o(nlogn)的小证明
- 基于比较的排序,时间复杂度下界是o(nlogn)的证明
- 基于比较的排序,时间复杂度下界是o(nlogn)的小证明
- 链表的排序 时间复杂度O(nlogn)
- LeetCode 148. Sort List--O(nlogn)时间复杂度和常数空间复杂度给链表排序
- Java-时间复杂度为O(nlogn)的排序算法(快速排序, 归并排序, 堆排序, 希尔排序)
- 单链表的归并排序:时间复杂度O(nlogn),空间复杂度O(1)
- 计数排序和简单桶排序(非比较排序,时间复杂度为O(n))
- leetcode之时间复杂度为O(nlogn)的链表排序
- 找包含N个元素的数组里第K大的元素(引申:快速排序、找中位数、找前K大的元素)的时间复杂度
- LeetCode-Sort List,链表排序(插入和归并),时间复杂度O(n^2) and O(nlgn)
- Java实现选择排序和冒泡排序执行时间的比较
- 一道看上去很吓人的算法面试题:如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
- 最长递增子序列,时间复杂度(O(nlogn))
- 比较 N个元素 一个一个地插入到一个堆中 以线性时间建立一个堆 已排序、反序、随机输入的运行时间
- 【Run Time error】比较时间*3(签到排序题)
- python插入排序和sort时间比较
- 各种查找、排序的时间复杂度
- 排序总结-时间复杂度和空间复杂度
- 二、排序(时间复杂度 O(nlogn))