Java快排算法,有了它直接当着面试官写快排

Java快速排序算法,快排算法,快排!

Talking is cheap Show me code

废话不多说、直接上代码,不会用?CV就好啦!

package meta.java.algo;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Arrays;

public class QuickSort {

    private static final Logger logger = LoggerFactory.getLogger(QuickSort.class);

    public static void main(String[] args) {
        int[] arr = ArrT.arr;
        logger.info("排序前:");
        logger.info(Arrays.toString(arr));
        standQuickSort(arr);
        //standQuickSortLeft(arr);
        //standQuickSortRight(arr);
        logger.info("排序后:");
        logger.info(Arrays.toString(arr));
    }

    public static void standQuickSort(int[] arr){
        standQuickSort(arr,0, arr.length-1);
    }
    private static void standQuickSort(int[] arr, int head, int tail) {
        if (head >= tail) return;
        int tempIndex = (int) (System.currentTimeMillis() % (tail - head + 1) + head);
        int key = arr[tempIndex], leftTemp = head, rightTemp = tail;
        for (; leftTemp < rightTemp && arr[leftTemp] < key; leftTemp++) {
        }//先处理一次,防止左值或右值丢失而造成重复,这里先预处理了左边,因为常规循环中是先处理的右边不能与之相同
        arr[tempIndex] = arr[leftTemp];

        while (leftTemp < rightTemp) {
            while (leftTemp < rightTemp && arr[rightTemp] > key) rightTemp--;
            if (leftTemp < rightTemp) {
                arr[leftTemp] = arr[rightTemp];
                leftTemp++;
            }
            while (leftTemp < rightTemp && arr[leftTemp] < key) leftTemp++;
            if (leftTemp < rightTemp) {
                arr[rightTemp] = arr[leftTemp];
                rightTemp--;
            }
        }
        arr[leftTemp] = key;
        standQuickSort(arr, head, leftTemp - 1);
        standQuickSort(arr, rightTemp + 1, tail);
    }

    public static void standQuickSortLeft(int[] arr){
        standQuickSortLeft(arr,0, arr.length-1);

    }
    private static void standQuickSortLeft(int[] arr, int head, int tail) {
        if (head >= tail) return;
        int key = arr[head], leftTemp = head, rightTemp = tail;
        while (leftTemp < rightTemp) {
            while (leftTemp < rightTemp && arr[rightTemp] > key) rightTemp--;
            if (leftTemp < rightTemp) {
                arr[leftTemp] = arr[rightTemp];
                leftTemp++;
            }
            while (leftTemp < rightTemp && arr[leftTemp] < key) leftTemp++;
            if (leftTemp < rightTemp) {
                arr[rightTemp] = arr[leftTemp];
                rightTemp--;
            }
        }
        arr[leftTemp] = key;
        standQuickSortLeft(arr, head, leftTemp - 1);
        standQuickSortLeft(arr, rightTemp + 1, tail);
    }

    public static void standQuickSortRight(int[] arr){
        standQuickSortRight(arr,0, arr.length-1);
    }
    private static void standQuickSortRight(int[] arr, int head, int tail) {
        if (head >= tail) return;
        int key = arr[tail], leftTemp = head, rightTemp = tail;
        while (leftTemp < rightTemp) {
            while (leftTemp < rightTemp && arr[leftTemp] < key) leftTemp++;
            if (leftTemp < rightTemp) {
                arr[rightTemp] = arr[leftTemp];
                rightTemp--;
            }
            while (leftTemp < rightTemp && arr[rightTemp] > key) rightTemp--;
            if (leftTemp < rightTemp) {
                arr[leftTemp] = arr[rightTemp];
                leftTemp++;
            }
        }
        arr[leftTemp] = key;
        standQuickSortRight(arr, head, leftTemp - 1);
        standQuickSortRight(arr, rightTemp + 1, tail);
    }

}

反复测试了几遍,应该没有BUG,嘻嘻😊

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值