归并排序
归并排序采用了一种思想,就是分治思想。
分治思想,顾名思义,分而治之。最典型的应用就是归并排序和mapReduce框架。
在归并排序中,一个数组取下标中点的数字对应的值。将数组分成两部分。
重复上述这个动作,直到每一小块至多只有2个数字。
然后再做对比。
以上称为分解过程。
下述为合并merge过程。
合并的过程呢就是两个小的数据集。依次比较。第1位比较另一个数据集的第1位。哪个小,哪个先进tmp数据集(append)。然后进去的那个数据所属的数据集往后稍1个,继续和另一个数据集的第1位比较。
重复上述,完成合并。
归并排序的最好,最坏,平均时间复杂度都为O(nlogn)。为啥嘞?因为他写死了中点这个东西。
空间复杂度是O(n)。在合并的过程中采用了tmp临时数组。
是稳定排序算法,append。
快速排序
快速排序有点类似于归并排序。
快排的思想是这样的:
说不清,直接找图了。这个之后再递归。
一个数字A[p,r],
随机指定一个位pivot,上图指定最后一个,方便理解。
从p开始有2个指针,i和j。i是交换才前进不交换就不前进。j每次比较都会前进。
交换的触发就是A[i] < A[pivot]。
当j到头之后,A[i]和A[j]互换。这样就被pivot分成了两个区域。
递归。
是一个原地,不稳定的排序算法。
不稳定的理解方式就是,他只和pivot对比,但是交换和A[i]交换。
时间复杂度通常情况是是O(nlogn),最差情况即倒序排列为O(n2)