nnpc.net
当前位置:首页 >> 快速排序最多的比较次数 >>

快速排序最多的比较次数

n*(n-1)/2是总的比较次数 o(n^2)是”时间复杂度”(你只要记住:时间复杂度=总的比较次数最高的那个阶方,因为n*(n-1)/2最大阶方是n^2). o(……)表示时间复杂度,就纯粹是一个符号而已,就像长度是m表示一样.

快速排序是先找到一个轴值,比较时把所有比轴值小的放到轴值的左边, 比轴值大的放到右边,再在两边各自选取轴值再按前面排序,直到完成 (1)已经排序完成,是最快的; (2)反序,需要将小于5的转移到5的左边,大于5的转移到5的右边,每个数都要经过比较,所以是最慢的 (3)轴值为9,需要将9右边的转移到左边,比较次数介于(1),(2)之间; (4)轴值为5,需要将左边的9转移到5的右边,3转移到5的左边; 总体比较次数(1)

快速排序最坏的情况是初始序列已经有序,第1趟排序经过n-1次比较后,将第1个元素仍然定在原来的位置上,并得到一个长度为n-1的子序列;第2趟排序经过n-2次比较后,将第2个元素确定在它原来的位置上,又得到一个长度为n-2的子序列;以此类推,最终总的比较次数: C(n) = (n-1) + (n-2) + + 1 = n(n-1)/2 最坏的情况下,快速排序的时间复杂度为O(n^2)

最好的情况是每次都能均匀的划分序列.例如 4,1,3,2,6,5,7,每次使用序列的第一个元素做枢轴.比较总次数为10次,交换3次,具体如下:第一次枢轴为4,序列划分为{2,1,3},4,{6,5,7}比较6次(4与每个元素比较一次),交换1次(4与2交换)第二次的两个序列枢轴分别为2和6,此时划分序列得{1},2,{3},4,{5},6,{7}比较4次(两个序列各比较两次),交换两次(1和2,6和5)第三次由于各个序列的元素都为1,因此排序完成得1,2,3,4,5,6,7

一般不考虑运行多少次,而是统计这个算法的运行效率,所用多长时间.一般的话最坏情况时间复杂度是O(n^2) .可以采用随机化进行优化,虽然最坏情况还是O(n^2)但是这跟计算机无关,只能说是运气不好.理论情况下是O(1/2^n).对于绝大多数数据是O(nlogn).

1,2,3,4,5,6,7;三次,最好 就是第一次取到4,以4为列子,就是最好取到的数是位于中间大于左面3个,小于右边3个;第一次比较比4小的放左边,大的右边.然后第二次;以同样的方法再取,取到2,6最好啦;比较左右各一次;共2次.(这里我把左右比较用一个循环控制比较算做一次)n=15,就是俩个n=7就是3次了快排也有点像二路归并:从一个无序的序列中随机取出一个值q做为支点,然后把大于q的放到一边,小于q的放到q的另一边,然后再以q为分界点,分别对q的两边 进行排序(快排时直接再对q两边重新取支点,整理,再取支点,直到支点两旁都有序.也就是支点两旁只有一个数时)

初始序列有序的时候,快速排序会退化成冒泡排序,趟数增多了,比较次数就增多了.

楼上说的是什么啊, 最坏情况下,是整个序列都已经有序且完全倒序 , 此时,快速排序退化为冒泡排序,要比较n*(n-1)/2次才能完成 最好的情况下只需一次!

都是 O(n方) n(n-1) n(n-1)/2 次

冒泡和快排最坏情况下比较次数是一样的:1+2+3++(n-1)时间复杂度:插入,冒泡,选择:O(n^2)希尔:O(n^1.2)快排,堆排:O(nlogn)

9371.net | snrg.net | mtwm.net | zxpr.net | pznk.net | 网站首页 | 网站地图
All rights reserved Powered by www.nnpc.net
copyright ©right 2010-2021。
内容来自网络,如有侵犯请联系客服。zhit325@qq.com