【八大排序】day1.快速排序

一、快速排序

/**
 * 快速排序:
 * 把待排序的数组分为左右两个区间,左边的都比中间的基准数小,右边的都比中间的基准数大。
 * 接着左右两边各自再做同样的工作,完成后再拆分继续,直到各区间只剩一个数为止。
 */
public static void quicksort(Integer[] arr, int start, int end) {
        if (start < end) {
            //把数组的第一位当成基准数
            int stand = arr[start];
            //记录要进行排序的下标
            int low = start;
            int high = end;
            //循环找到比基准数大的数和比基准数小的数
            while (low < high) {
                //先从右开始,右边的数要比基准数大
                while (low < high && arr[high] >= stand) {
                    high--;
                }
                //使用右边的数替换左边的数
                arr[low] = arr[high];
                //再从左开始,左边的数要比基准数小
                while (low < high && arr[low] <= stand) {
                    low++;
                }
                //使用左边的数替换右边的数
                arr[high] = arr[low];
            }
            //把标准值赋值给下标重合的位置
            arr[low] = stand;
            //处理左边的小的数
            quicksort(arr, start, low);
            //处理右边的大的数
            quicksort(arr, low + 1, end);
        }
    }

注意的点:

1.先从右开始移动指针

2.移动指针的条件,右边的数要大于或等于基准数 ,左边的数要小于等于,这样不会发生死循环

二、全部代码

public class _2_QuickSort {
    public static void main(String[] args) {
        Integer[] arr = {3, 5, 1, 7, 2, 3, 4, 8};
        quicksort(arr, 0, arr.length - 1);
        System.out.println(Arrays.toString(arr));
    }

    public static void quicksort(Integer[] arr, int start, int end) {
        if (start < end) {
            //把数组的第一位当成基准数
            int stand = arr[start];
            //记录要进行排序的下标
            int low = start;
            int high = end;
            //循环找到比基准数大的数和比基准数小的数
            while (low < high) {
                //先从右开始,右边的数要比基准数大
                while (low < high && arr[high] >= stand) {
                    high--;
                }
                //使用右边的数替换左边的数
                arr[low] = arr[high];
                //再从左开始,左边的数要比基准数小
                while (low < high && arr[low] <= stand) {
                    low++;
                }
                //使用左边的数替换右边的数
                arr[high] = arr[low];
            }
            //把标准值赋值给下标重合的位置
            arr[low] = stand;
            //处理左边的小的数
            quicksort(arr, start, low);
            //处理右边的大的数
            quicksort(arr, low + 1, end);
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值