递归
求中点 mid=L+(R-L)/2 mid=L+((R-L)>>1)右移一位更快
子问题等量
mast er公式
T(N) = a*T(N/b)+O(N^d)
T(N):母
T(N/b):子 (是否等量)
a:调用多少次
O(N^d):除去子变量之外的时间复杂度
子问题等量
上面的满足这个公式
T(N)= 2*T(N/2)+O(1)
时间复杂度
归并排序
proress类 2T(N/2)
merge类 两个区域 之往前走 不回退 时间复杂度是O(N)
T(N)= 2T(N/2)+ O(N)
a = 2 , b = 2 d = 1
所以结果
O(N*logN)没有浪费比较行为,比较行为信息保留下来了,变成了有序的东西,所以会向下传递
O(N^2)浪费了大部分的比较行为
小和问题
逆向思维 从逆序数找左边比自己小的数,可以逆向思维找左边比自己大的数,结果是一样的
相等的时候需要先拷贝右组的,这样才能确定右边有几个数比他大
上代码
不会漏掉 不会重复
荷兰国旗问题
快排1.0
最后一个数做划分,小于等于num的在左边,大于num的在右边,把这个数 和大于num的最左侧的数进行交换,然后小于等于num的最右侧数和大于num的数做交换,这样不断地递归,最后就可以排出来顺序。 最差情况O(N^2)
快排2.0 num 最差情况O(N^2)
快排3.0 从中间抽取一个数 放在最右侧,会有很多种 的情况 平均情况的O(N*logN)