排序算法-快排

1、快速排序

①首先随机选出一个数组中的数,当做参考值

②分成三个区域,比参考值小的区域,等于参考值的区域,比参考值大的区域

③进行快排

④quickSort过程和partition过程

public class QuickSort {
    public static void quickSort(int[] arr){
//        if(arr == null || arr.length<2){
//            return;
//        }
//        quickSort(arr,0,arr.length-1);
        //1、判断是否是个长度大于2或者为空的数组,如果是的话,不用进行排序
        if(arr.length<2 || arr == null){
            return;
        }
        quickSort(arr,0,arr.length-1);
    }
    //arr[]排好序
    public static void quickSort(int[] arr,int L,int R){
//        if(L<R){
//            swap(arr,L+(int)(Math.random()*(R - L + 1)),R);
//            int[] p = partition(arr,L,R);
//            quickSort(arr,L,p[0]-1);
//            quickSort(arr,p[1]+1,R);
//        }
        //2、进行排序,快排
        if(L<R){//判断条件,如果左边的数小于右边的,进行快排
            //将随机选一个数,作为快排的参考值,放到数组的最后一个位置
            swap(arr,L+(int)(Math.random()*(R-L+1)),R);
            //快排的分区,定义一个数组,存两个值,一个是比参考值小的区域的右边界大1的L,一个是比参考值大的左边界小1的R
            //依靠一个方法返回这两个边界
            int p[] = partition(arr,L,R);
            //快排递归
            quickSort(arr,L,p[0]-1);
            quickSort(arr,p[1]+1,R);
        }

    }
    //这是一个处理arr的函数
    //默认以arr[r]做划分,arr[r]->p <p    ==p     >p
    //返回等于区域(左边界,右边界),所以返回一个长度为2的数组res,res[0] res[1]
    public static int[] partition(int[] arr,int L,int R){
//        int less = L-1;
//        int more = R;
//        while(L < more){
//            if(arr[L] < arr[R]){
//                swap(arr,++less,L++);
//            }else if(arr[L] > arr[R]){
//                swap(arr,--more,L);
//            }else{
//                L++;
//            }
//        }
//        swap(arr,more,R);
//        return new int[]{less+1,more};
        //定义一个变量,是指小于参考值的左边界,和大于参考值的右边界
        int less = L-1;
        int more = R;
        while(L<more){
            if(arr[L]<arr[R]){
                swap(arr,++less,L);
            }else if(arr[L]>arr[R]){
                swap(arr,--more,L);
            }else{
                L++;
            }
        }
        //将最后一个存放的参考值与大于参考值的区域的左边界交换
        swap(arr,more++,R);
        //将最后得到的排序完的参考值的区域的左右边界返回
        return new int[]{less+1,more-1};
    }

    private static void swap(int[] arr, int j, int i) {
//        arr[j] = arr[j]^arr[i];
//        arr[i] = arr[j]^arr[i];
//        arr[j] = arr[j]^arr[i];
        int temp;
        temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    public static void main(String[] args){
        int[] arr = new int[]{12,4,6,8,3,8,56};
        QuickSort.quickSort(arr);
        for(int j=0;j<arr.length;j++){
            System.out.println(arr[j]);
        }
    }
}

2、快速排序第一次练习

package com.joy.sort.quicksort;

import java.util.ArrayList;
import java.util.List;

/**
 * @author joy
 * @Package arithmetic
 * @Description: 快速排序
 * @date 2022/3/15 9:13
 */
public class QuickSort {
    //调用快速排序的总方法
    public static void quickSort(int arr[]){
        quickSort(arr,0,arr.length-1);
    }

    private static void quickSort(int[] arr, int L, int R) {
        if(arr == null || arr.length<2){
            return;
        }
        if(L < R){
            //随机调选出一个数,作为参照值,放在数组最后的位置
            int random = L+(int)(Math.random()*(R-L+1));
            swap(arr,random,R);
            //进行排序
            List<Integer> list = partition(arr, L, R);
            quickSort(arr,0,list.get(0));
            quickSort(arr,list.get(1),R);
        }
    }

    //排序的partition过程
    private static List<Integer> partition(int[] arr, int L, int R) {
        int less = L-1;
        int more = R;

        while(L<more){
            if(arr[L]<arr[R]){
                swap(arr,L,++less);
                L++;
            }else if(arr[L]>arr[R]){
                swap(arr,L,--more);
            }else{
                L++;
            }
        }
        swap(arr,R,more);
        ArrayList<Integer> list = new ArrayList<>();
        list.add(less);//作为下一次排序的左边区域的R
        list.add(more+1);//作为下一次排序的右边区域的L
        return list;
    }

    //交换数组中两个数位置的方法
    private static void swap(int[] arr, int random, int R) {
//        arr[random] = arr[random]^arr[R];
//        arr[R] = arr[random]^arr[R];
//        arr[random] = arr[random]^arr[R];
        int temp = arr[random];
        arr[random] = arr[R];
        arr[R] = temp;
    }

    public static void main(String[] args) {
        int arr[] = new int[]{8,2,6,4,3};
        quickSort(arr);
        for(int i : arr){
            System.out.println(i);
        }
    }
}

posted @ 2021-12-22 22:22  刘小呆  阅读(144)  评论(0编辑  收藏  举报