美文网首页
数据结构与算法 快速排序

数据结构与算法 快速排序

作者: dylan丶QAQ | 来源:发表于2020-11-23 10:05 被阅读0次

    起因:快速排序,又称分区交换排序,简称快排,之前没有了解过,抽空学习一下。


    快速排序

    1 快速排序

    快速排序的定义:
    快速排序,又称分区交换排序,简称快排,快速排序通常明显比其他算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地达成。
    它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

    2 快速排序 概述

    快速排序算法的步骤如下:

    1. 挑选基准值:从数列中挑出一个元素,称为“基准”(pivot),
    2. 分割:重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(与基准值相等的数可以到任何一边)。在这个分割结束之后,对基准值的排序就已经完成,
    3. 递归排序子序列:递归地将小于基准值元素的子序列和大于基准值元素的子序列排序。

    递归到最底部的判断条件是数列的大小是零或一,此时该数列显然已经有序。
    选取基准值有数种具体方法,此选取方法对排序的时间性能有决定性影响。

    动图演示:

    2 快速排序 代码实现
    package com.algorithm;
    
    import java.util.Arrays;
    
    /**
     * @ClassName QuickSort
     * @Description TODO
     * @Author dylan
     * @Date 2020/11/22 10:13
     * @Version 1.0
     */
    public class QuickSort {
    
        public static void main(String[] args) {
            int[] array = {3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48};
            // 只需要修改成对应的方法名就可以了
            quickSort(array);
    
            System.out.println(Arrays.toString(array));
        }
    
        /**
         * Description: 快速排序
         *
         * @param array
         * @return void
         * @author dylan
         * @date 2019/7/11 23:39
         */
        public static void quickSort(int[] array) {
            quickSort(array, 0, array.length - 1);
        }
    
    
        private static void quickSort(int[] array, int left, int right) {
            if (array == null || left >= right || array.length <= 1) {
                return;
            }
            int mid = partition(array, left, right);
            quickSort(array, left, mid);
            quickSort(array, mid + 1, right);
        }
    
    
        private static int partition(int[] array, int left, int right) {
            int temp = array[left];
            while (right > left) {
                // 先判断基准数和后面的数依次比较
                while (temp <= array[right] && left < right) {
                    --right;
                }
                // 当基准数大于了 arr[left],则填坑
                if (left < right) {
                    array[left] = array[right];
                    ++left;
                }
                // 现在是 arr[right] 需要填坑了
                while (temp >= array[left] && left < right) {
                    ++left;
                }
                if (left < right) {
                    array[right] = array[left];
                    --right;
                }
            }
            array[left] = temp;
            return left;
        }
    
    }
    
    
    

    不要以为每天把功能完成了就行了,这种思想是要不得的,互勉~!

    相关文章

      网友评论

          本文标题:数据结构与算法 快速排序

          本文链接:https://www.haomeiwen.com/subject/epquiktx.html