快速排序

快速排序

思路

  1. 给定一个数组,将最左边(或最右边)的数定义为基准数,再给两个指针遍历这个数组。

  2. 在满足左边指针不等于右边指针的情况下遍历数组;

    • 先从右边开始遍历,当左边指针小于右边指针且数组元素小于基准数,则停下;

    • 再从左边开始遍历,当左边指针小于右边指针且数组元素大于基准数,则停下;

    • 交换两个数的值;

  3. 当左边指针与右边指正相等时,两个指针相遇,交换基准数与相遇指针位置数组元素的值,此时基准数左边的数都比基准数小,基准数右边的值都比基准数大;

  4. 然后对左边进行递归的快速排序;

  5. 对右边进行递归的快速排序。

代码实现

public class QuickSort {
    public static void main(String[] args) {
        int[] arr = {-9, 78, 0, 23, -567, 70};
        quickSort(arr,0, arr.length-1);
        System.out.println(Arrays.toString(arr));
    }
    private static void quickSort(int[] arr, int left, int right) {
       //进行判断,如果左边索引比右边索引要大,是不合法的,直接使用return结束这个方法
        if (left > right) {
            return;
        }
        int base = arr[left];//定义基准数
        int i=left;//定义左指针
        int j=right;//定义右指针
        int temp;
        //在i和j不相等的时候,再循环中进行检索
        while (i!=j){
            //先从右边寻找比基准数小的数,如果检索到就停下
            while (arr[j] >= base && i<j) {
                j--;
            }
            while (arr[i] <= base && i<j) {
                i++;
            }
            //交换顺序
            temp = arr[i];
            arr[i] = arr[j];
            arr[j]=temp;
        }
        //如果while循环的条件不成立,则代表i=j,相遇;交换基准数与相遇位置的元素;
         arr[left] = arr[i];
        arr[i] = base;
        //排左边
        quickSort(arr,left,j-1);
        //排右边
        quickSort(arr,j+1,right);
    }
}

posted @ 2022-09-23 15:38  与否业务NOW  阅读(24)  评论(0)    收藏  举报