算法步骤:

  • 从数列中跳出一个元素,成为“基准
  • 重新排序数列,所有元素比基准小的放在基准前面,比基准大的放在后面,相等的放在任意一边,在这个分区退出后,基准处于数列中间位置,这个被称为分区操作
  • 递归的把小序列大序列进行上述排序

代码实现

  1. // 快速排序
  2. public void QuickSort(int[] arr, int left, int right)
  3. {
  4. if (left >= right)
  5. {
  6. return;
  7. }
  8. int L = left;
  9. int R = right;
  10. int pivot = arr[left]; // 选取第一个元素作为 pivot
  11. while (left < right)
  12. {
  13. while (right > left && arr[right] >= pivot) // 先右标志向左推进
  14. {
  15. right -= 1;
  16. }
  17. if (arr[right] < pivot)// 右标志停下来,要么是右标志和左标志重合,要么是右标志的值小于 pivot了,如果是后者,需要将左标志的值换成此时右标志的。
  18. {
  19. arr[left] = arr[right];
  20. }
  21. while (left < right && arr[left] < pivot) // 接下来左标志向右推进
  22. {
  23. left += 1;
  24. }
  25. if (arr[left] >= pivot)
  26. {
  27. arr[right] = arr[left];
  28. }
  29. if (left == right)
  30. {
  31. arr[left] = pivot;
  32. }
  33. }
  34. QuickSort(arr, L, left - 1); // 前后关系无所谓
  35. QuickSort(arr, right + 1, R);
  36. }
// 快速排序
public static void Quick(int[] arr, int begin, int end)
{
    if(begin < end)
    {
        int key = arr[begin];
        int i = begin;
        int j = end;

        while(i < j)
        {
            while(i < j && arr[j] > key)
            {
                --j;
            }
            if(i < j)
            {
                arr[i] = arr[j];
                ++i;
            }
            while(i < j && arr[i] < key)
            {
                ++i;
            }

            if(i < j)
            {
                arr[j] = arr[i];
            }
        }
        arr[i] = key;

        Quick(arr, begin, i - 1);
        Quick(arr, i + 1, end);
    }
}

结果截图

image.png

算法复杂度


最好 最坏 平均 空间复杂度 稳定不?
快速排序 十大排序算法 - 快速排序 - 图2 十大排序算法 - 快速排序 - 图3 十大排序算法 - 快速排序 - 图4 十大排序算法 - 快速排序 - 图5 不稳定

参考链接

⭐⭐

⭐⭐