快速排序原理和边界条件

快速排序的原理

  • 快速排序的原理
  • 快速排序的简单优化
  • 快速排序的注意点
    • 当pivot取左边界
    • 当pivot取中间点
    • 当pivot取有边界


快速排序的原理

  • 选择基准值
  • 将数组分成两个子数组:小于基准值的元素和大于基准值的元素
  • 对这两个子数组进行上述步骤直到基准值
  • 注:快速排序思想类似于树的前序遍历

快速排序原理和边界条件_第1张图片

快速排序的简单优化

  • 可以通过循环先找到左边最小,再通过循环找到右边最小;然后直接将两者进行交换;交换之后直接跳过这两个元素的比较,可以减少比较步骤
  • 实测pivot 选择在端点不如在中间点或者随机点的效率高
  	int i = l - 1, j = r + 1, x = a[l + r >> 1];//l-1 和 r+1 是为了满足后面的do while
    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);
// 若取quicksort(a, l, i-1),quicksort(a, i, r); i最后取值为0 
//quicksort(a, i, r); 最后会在quicksort(a, 0, 1);中死循环**

当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);
// 若取quicksort(a, l, j),quicksort(a, j+1, r); j最后取值为1 
//quicksort(a, l, j); 最后会在quicksort(a, 0, 1);中死循环**

你可能感兴趣的:(算法,排序算法,算法,数据结构)