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