快排

快排

  • 何为快排:通过迭代跟中枢轴上的元素进行比较,有两种情况,用两个临时变量对数组一个从前遍历,一个从后遍历,当那个从前开始遍历的临时变量值1大于中枢轴的值时、且当那个从后开始遍历的临时变量值2小于中枢轴值时,两个临时变量存的数据进行互相交换。

  • 思路:

  1. 声明中枢值key为下标0的元素

  2. 将left和right分别赋给l变量和r变量,为下面操作提供类似指针操作遍历

  3. 满足当l小于r时,l和r开始工作查找,先r(右边)遍历再l(左边)遍历查找

  4. 直到都工作完,交换数据

  5. 迭代

    • 首先把l中的数据给了key做为新的中枢值

    • 其次把原来的key的数据给了l,实现了数据交换

    • 然后递归左部分进行排序:从left到l-1

      递归右部分进行排序:从l+1到right

  • 代码实现:
package com.guodaxia.quicksorts;

/**
 * @ author Guo daXia
 * @ create 2022/11/14
 */
public class QuickSorts {
    public static void main(String[] args) {
        System.out.print("原数组:[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]);
            System.out.print(" ");
        }
        System.out.println("]");

        System.out.print("使用快排排序好的数组:[");
    quick(arr,0,arr.length-1);
        for (int i :arr) {
            System.out.print(i);
            System.out.print(" ");
        }
        System.out.println("]");
    }

    //初始化数组
     static int[] arr = new int[]{1,7,4,6,8,9,2,3};

    //定义一个方法,用于实现快排
    public static void quick(int[] arr, int left, int right){

        //先解决掉一些限制,主要是现实限制
        if (arr==null||arr.length==0){
            return;
        }
        if (left>right){
            return;
        }
        //声明枢轴:即中位数
        int key = arr[left];//约定第一个元素
        int l = left; //临时变量l用于遍历,下面r作用相同
        int r = right;

        while (l!=r){//当l变量在r的左边,进行循环查找

            while (arr[r]>=key&&l<r){//r变量从右找,直到找到值小于key值为止
                r--;
            }
            while (arr[l]<=key&&l<r){//l变量从左找,直到找到值大于key值为止
                l++;
            }
            //两个临时变量已经停下来了:arr[r]值小于key;arr[l]值大于key
            //可以交换两临时变量对应的数据\
            if (l<r){
                int temp = arr[l];
                arr[l]= arr[r];
                arr[r]=temp;
            }

        }
        //通过以上第一遍循环,实现了一次交换,数组分为两个小部分:
        //左边的值都小于key值,而右边的值都大于key值
        //使用两个递归,各种实现通过新key值交换
        arr[left]=arr[l];//将l中的数据给left,
        arr[l]=key;//将key的数据给l

        quick(arr,left,l-1);//左小部分
        quick(arr,l+1,right);//右小部分
    }
}
posted @ 2022-11-14 21:05  郭培鑫同学  阅读(522)  评论(0编辑  收藏  举报