zoukankan      html  css  js  c++  java
  • 六,快速排序

    快速排序,顾名思义,排序速度很快,也是面试常常被问到的排序算法之一。

    快速排序关键在于一个轴,让其他的数字和这个轴的值相比较,如果小于等于这个轴把数字放到轴的左边,否则放到右边。这样你会发现,这个轴现在在的位置就是他应该在的位置了。

     那么第一次循环后就变成这个样子,然后分别指定两边的数组的轴,分别对两个数组进行同样的步骤即可。其实从某种角度来讲,他和选择排序类似,选择排序是选择一个数字比较找到最小的值往前放,而快速排序是指定一个数字,找到他的位置。来看代码怎么实现吧

    package test;
    
    /**
     * <p></p>
     *
     * @author zy 刘会发
     * @version 1.0
     * @since 2020/4/16
     */
    public class QuickSort {
        public static void main(String[] args) {
            int arr[] = new int[]{5, 7, 3, 1, 6, 9, 4, 0};
            sort(arr, 0, arr.length - 1);
            print(arr);
        }
    
        public static void sort(int arr[], int leftBound, int rightBound) {
            //因为这里要用到递归,所以必须给他一个出口
            if (leftBound >= rightBound) return;//这里左边界应该永远小于右边界,否则直接返回。
            int compare = compare(arr, leftBound, rightBound);//这个时候已经将数组分成两个部分了,而返回值也就是分界(轴),因为轴在这个方法调用的结束就已经确定了他的位置,所以不再需要排序了
            //排左边
            sort(arr, leftBound, compare - 1);
            //排右边
            sort(arr, compare + 1, rightBound);
    
        }
    
        public static int compare(int arr[], int leftBound, int rightBound) {
            int axis = arr[rightBound];//轴的值,定义左右边的的边界值就是轴
    
            int left = leftBound;//左只针的位置
            int right = rightBound - 1;//右指针的位置
    
    
            while (left <= right) {//只要左指针小于有指针就一直查找
                while (left <= right && arr[left] <= axis) left++;//左指针的开始寻找一个比轴大的数字
                while (left <= right && arr[right] > axis) right--;//右指针开始寻找一个比轴小的数字
                if (left < right)//如果左指针小于右指针交换
                    swap(arr, left, right);//如果找到了就交换位置
            }
            //然后把轴和左指针位置交换
            swap(arr, rightBound, left);
            //这个时候,左指针指的位置就是轴的位置,将他返回。
            return left;
        }
    
        public static void swap(int arr[], int on, int off) {
            int temp = arr[on];
            arr[on] = arr[off];
            arr[off] = temp;
        }
    
        public static void print(int arr[]) {
            for (int i = 0; i < arr.length; i++) {
                System.out.printf("%d,", arr[i]);
            }
        }
    }

    上边的代码是以有边界作为轴,当然轴的位置是你自己定的,不一定非得是右边界。

  • 相关阅读:
    c++ accumulate
    Croc Champ 2013 Round 2 (Div. 2 Edition) B. Ksusha the Squirrel
    ural 1017. Staircases
    ural 1012Kbased Numbers. Version 2 1013. Kbased Numbers. Version 3
    ural 1008. Image Encoding
    ural 1009. Kbased Numbers
    echo命令去掉换行符
    linux中shell 参数变量
    C#中可变字符串StringBuilder和String
    C#异常处理语句
  • 原文地址:https://www.cnblogs.com/Tiandaochouqin1/p/12711536.html
Copyright © 2011-2022 走看看