排序算法之快速排序

快速排序

在这里插入图片描述

描述

这个就是有三个参数

leftPoint就是小于num的最后一个数字所处的地方没有就是-1

rightPoint就是大于num的最后一个数字所处在的地方没有就是length

因为我们这里每次都用最后一个数字作比较

所以就是length-1往前挪

当arr[i]遇到比自己小的数字我们就要++leftPoint让这个下标更新然后和i位置上的数字做调换并++i 此时更新了左侧指针

当arr[i]遇到和自己相同的数直接让i做+1操作

当arr[i]遇到比自己大的数字我们就要--rigthPoint让这个下标更新然后和i做调换但不i+1因为这时候换的是一个没有做过比较的新数字

package com.yuan.struck_data.sort;

import javax.lang.model.SourceVersion;
import java.util.Random;

/**
 * 快速排序
 */
public class QuickSortTest {


    /**
     * 快速排序1.0
     *
     * @param arr 整型数组
     * @param L   左指针
     * @param R   右指针
     */
    public static void quickSort1(int[] arr, int L, int R) {
        // 略
    }

    /**
     * 快速排序2.0
     *
     * @param arr 整型数组
     * @param L   左指针
     * @param R   右指针
     */
    public static void quickSort2(int[] arr, int L, int R) {
        if (L < R) {
            // 第一次分层
            int[] pointPlace = partition(arr, L, R);
            quickSort2(arr, L, pointPlace[0] - 1);
            quickSort2(arr, pointPlace[1] + 1, R);
        }
    }

    /**
     * 快速排序3.0
     *
     * @param arr 整型数组
     * @param L   左指针
     * @param R   右指针
     */
    public static void quickSort3(int[] arr, int L, int R) {
        if (L < R) {
            // 随机产生一次下标与最后一个数交换位置
            swap(arr, L + (int) (Math.random() * (R - L + 1)), R);

            // 分层拿到左右边界
            int[] pointPlace = partition(arr, L, R);
            quickSort3(arr, L, pointPlace[0] - 1);
            quickSort3(arr, pointPlace[1] + 1, R);
        }
    }


    /**
     * 快速排序分层
     *
     * @param arr 整型数组
     * @param L   左指针
     * @param R   右指针
     */
    public static int[] partition(int[] arr, int L, int R) {
        // 左侧边界
        int lessPoint = L - 1;
        // 右侧边界
        int rightPoint = R;

        // 循环操作
        while (L < rightPoint) {
            // 如果当前位置比 NUM大放到右边
            if (arr[L] > arr[R]) {
                // 换位置 并且让右边界向左挪动一位
                swap(arr, L, --rightPoint);
            }
            // 相等
            else if (arr[L] == arr[R]) {
                // 只用动指针
                L++;
            }
            // 如果当前位置小于 NUM放到左边
            else {
                // 放到左边并且左边界向右挪动一位
                swap(arr, ++lessPoint, L++);
            }
        }
        // 因为自己是没做比较的所以要放到=区域
        swap(arr, rightPoint, R);
        // 获取左右指针位置
        return new int[]{lessPoint + 1, rightPoint};
    }

    /**
     * 交换
     *
     * @param arr 整型数组
     * @param L   左指针
     * @param R   右指针
     */
    public static void swap(int[] arr, int L, int R) {
        int temp = arr[L];
        arr[L] = arr[R];
        arr[R] = temp;
    }

    public static void main(String[] args) {
        int arr[] = {1, 5, 6, 2, 4, 7, 8, 0, 7};

        quickSort3(arr, 0, arr.length - 1);
 
        for (int num : arr) {
            System.out.print(num + " ");
        }
    }
}

我是本期小编⚪⚪
遇到Bug需要帮助,
欢迎加wx:
xmzl1988
备注"csdn博客“
温馨提示此为有偿服务;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值