八大排序算法之-快速排序(QuickSort)

快速排序图解:

在这里插入图片描述

思路:

  1. 以数组的中轴数为基准数mid。
  2. 左指针left从第一个元素开始,右指针right从最后一个元素开始。
  3. 若左指针left元素大于中轴数mid,右指针right元素小于中轴数,则将左右两边元素交换。
  4. 小于中轴数的元素在左边,大于中轴数的元素在右边。
  5. 根据以上的步骤分别向左、向右递归。

执行步骤:

  1. 指定中轴数为基准数,左边从第一位开始遍历,右边从倒数最后一位开始遍历。
  2. 若左下标小于右下标,循环遍历。
  3. 左元素小于中轴数,左下标+1,进入循环;右元素小于中轴数,右下标-1。
  4. 判断左下标是否大于右下标。
  5. 将左右元素互换。
  6. 左元素等于中轴数,右下标-1;右元素等于中轴数,左下标+1。
  7. 若左右下标相等,将其错位移开。
  8. 向左递归,向右递归。
import java.util.*;

public class QuickSort {
	public static void main(String[] args) {
		int[] arr = {5,6,3,7,9,0,4,3,5};
		f(arr, 0, arr.length - 1);
		System.out.println(Arrays.toString(arr));
	}
	
	public static void f(int[] arr, int left, int right) {
		// 1.保存最左边元素
        int l = left;
        // 保存最右边元素
        int r = right;
        // 算出中轴数
        int pivot = arr[(left + right) / 2];
        int temp;
        // 2.若左边小于右边,循环交换中轴两边的数
        while (l < r) {
            // 3.如果左边元素小于中轴元素,将左元素下标+1
            while (arr[l] < pivot)
                l++;
            // 若右边元素大于中轴元素,将右边元素下标-1
            while (pivot < arr[r])
                r--;
            // 4.判断左下标是否大于等于右下标,若大于等于则break,退出循环
            if (l >= r)
                break;

            // 5.经过两个while循环后,左边的值大于中轴数,右边的值小于中轴数,将左右的元素交换
            temp = arr[l];
            arr[l] = arr[r];
            arr[r] = temp;
            // 6.交换后判断左边元素是否与中轴相等,若左边相等,将右下标往左移
            if (arr[l] == pivot)
                r--;
            // 交换后判断右边元素是否与中轴相等,若右边相等,将做下标往右移
            if (arr[r] == pivot)
                l++;
        }
        
        // 7.若左边下标和右边下标相等,将其错位移开,防止栈溢出
        if (l == r) 
            l++;
            r--;
        // 8.向左边递归,右边元素改变
        if (left < r)
            quick(arr, left, r);
        // 向右边递归,左边元素改变
        if (l < right)
            quick(arr, l, right);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值