快速排序利用分治的思想,每次选取一个主元,把数组分为部分。
需要考虑的是:
1.如何选取主元,主元的选取关系着算法的效率,最好情况下每次主元大小居中,复杂度为nlogn;最坏情况下,主元每次都在端点。
2.如何划分为两部分。
主元的选取:取左中右三个取中位数;
子集划分:
调用上面的方法后,主元被放到Right-1处;现在处理这[Left,Right-1]这部分,取出Left作为i,Right-2作为j;A[i]<主元,i++;否则停止。A[j]>主元,j--;否则停止。i<j,否则两个交换A[i]A[j].最后交换A[i]与主元;此时主元被放到最终的位置上了;
如果有元素等于主元,交换吗?
考虑一种极端的情况,所有的数都相等;如果交换,每次对半,复杂度nlogn,如果不换,每次都在端点,复杂度n²;所有还是交换比较好;快排使用递归实现,涉及很多进栈出栈,在分段的数组规模小(如100个)时,调用插入排序,效果更好;