image.png

    1. def partition(arr,low,high):
    2. # 左端
    3. i = low - 1
    4. # 以最右端为基准元素
    5. pivot = arr[high]
    6. # 遍历
    7. for j in range(low , high):
    8. # 当前元素小于或等于 pivot
    9. if arr[j] <= pivot:
    10. # 左往前
    11. i += 1
    12. # 左右互换
    13. arr[i], arr[j] = arr[j], arr[i]
    14. # 最后左端指向元素和pivot互换
    15. arr[i + 1], arr[high] = arr[high],arr[ i + 1]
    16. # 返回新的划分点位置
    17. return i + 1
    18. # 快速排序函数
    19. def quickSort(arr, low, high):
    20. if low < high:
    21. pi = partition(arr,low,high)
    22. quickSort(arr, low, pi-1)
    23. quickSort(arr, pi+1, high)
    24. if __name__ == "__main__":
    25. nums = [5, 2, 9, 7, 6, 12, 3, 4]
    26. low, high = 0, len(nums) - 1
    27. quickSort(nums, low, high)
    28. print(nums)
    1. import java.util.Arrays;
    2. /**
    3. * @Author dyliang
    4. * @Date 2020/10/2 15:35
    5. * @Version 1.0
    6. */
    7. public class Sort {
    8. private static int[] arr = {3,5,1,6,2,9};
    9. public static void main(String[] args) {
    10. quickSort(arr, 0, arr.length - 1);
    11. System.out.println(Arrays.toString(arr));
    12. }
    13. private static void quickSort(int[] arr, int left, int right) {
    14. if (left < right) {
    15. int pivot = partition(arr, left, right); // 将数组分为两部分
    16. quickSort(arr, left, pivot - 1); // 递归排序左子数组
    17. quickSort(arr, pivot + 1, right); // 递归排序右子数组
    18. }
    19. }
    20. private static int partition(int[] arr, int left, int right) {
    21. int pivot = arr[left]; // 枢轴记录
    22. while(left < right) {
    23. while (left < right && arr[right] >= pivot) --right;
    24. arr[left] = arr[right]; // 交换比枢轴小的记录到左端
    25. while (left < right && arr[left] <= pivot) ++left;
    26. arr[right] = arr[left]; // 交换比枢轴小的记录到右端
    27. }
    28. // 扫描完成,枢轴到位
    29. arr[left] = pivot;
    30. // 返回的是枢轴的位置
    31. return left;
    32. }
    33. }

    一次partition的过程如下所示:
    image.png