快速排序的原理
- 选择基准值
- 将数组分成两个子数组:小于基准值的元素和大于基准值的元素
- 对这两个子数组进行上述步骤直到基准值
- 注:快速排序思想类似于树的前序遍历
快速排序的简单优化
- 可以通过循环先找到左边最小,再通过循环找到右边最小;然后直接将两者进行交换;交换之后直接跳过这两个元素的比较,可以减少比较步骤
- 实测pivot 选择在端点不如在中间点或者随机点的效率高
int i = l - 1, j = r + 1, x = a[l + r >> 1];
while (i < j)
{
do i ++ ; while (a[i] < x);
do j -- ; while (a[j] > x);
if (i < j) swap(a[i], a[j]);
}
int i = l, j = r, pivot = a[r+l>>1],flag=0;
while(i < j)
{
if(flag == 1){i++;j--;flag=0;}
while(a[i] < pivot) i++;
while(a[j] > pivot) j--;
if(i < j) {swap(a[i], a[j]);flag=1;}
}
**quicksort(a, l, j);
quicksort(a, j+1, r);**
快速排序的注意点
当pivot取左边界
当pivot= a[l]时,**quicksort(a, l, j),quicksort(a, j+1, r);
当pivot取中间点
当pivot= a[r+l>>1]时,**quicksort(a, l, j),quicksort(a, j+1, r);**
当pivot= a[r+l+1>>1]时,**quicksort(a, l, i-1),quicksort(a, i, r);**
当pivot取有边界
当pivot= a[r]时,**quicksort(a, l, i-1),quicksort(a, i, r);