JAVA 快速排序

196 阅读1分钟
package com.排序;

import java.util.Arrays;

public class QuickSort20210429 {

    /**
     *  使用 数据中的最高位的 数据作为中间数 然后进行快速排序
     * @param list
     * @param low
     * @param high
     * @return
     */
    public static int substring(int[] list,int low,int high){
        //定义左边的起始 下标
        int n = low-1;
        //定义右边的起始 下标
        int m = high;
        // 最高位 作为中间值进行声明
        int center = list[high];

        //开始一个 循环
        while(true){
            //  n坐标 < m坐标  循环寻找   从前往后  大于中间数的值的坐标
            while (list[++n]<center && n<m){}
            //  n坐标 < m坐标  循环寻找   从后往前  小于中间数的值的坐标
            while (list[--m]>center && n<m){}
            if(n<m){
                //找到了 这俩个数之后 开始交换位置。
                swap( list , n, m);
            }else {
                //一直找不到 直到 n>m 结束循环
                break;
            }
        }
        // 把这个 中位数 放到 坐标交汇的地方
        swap( list , n, high);

        //返回当前 快排的 切分数据的中位数的下标
        return n;
    }
    //排序方法 递归模型
    public static void sort(int[] list,int low,int high){
        if(low<high){
            // 首先进行一个分片 找到一个中间值
            int temp = substring(list,low,high);
            //找到中间值之后 左边的排序 右边的排序 递归下来就是最后完成排序的数据
            sort(list,low,temp-1);
            sort(list,temp+1,high);
        }
    }
    /**
     * 位置交换
     * @param list
     * @param indexA
     * @param indexB
     */
    private  static void swap(int[] list ,int indexA,int indexB){
        // a b 互换  需要 temp临时存放一下 然后交换
        int temp = list[indexA];
        list[indexA]= list[indexB];
        list[indexB]=temp;
    }

    public static void main(String[] args){
        int[] arr = {10,7,2,4,7,62,3,4,2,1,8,9,19};
        sort(arr, 0, arr.length-1);
        Arrays.stream(arr).forEach(one->{
            System.out.print(one + " ");
        });
    }
 }

image.png