• 快速排序


    图解快速排序

     

    快速排序是由C. A. R. Hoare东尼·霍尔)在1962年提出一种排序算法。其基本思想是基本思想是,通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

     

    思想: 1.在待排序的元素任取一个元素作为基准(通常选第一个元素,但最的选择方法是从待排序元素中随机选取一个作为基准),称为基准元素;

           2.将待排序的元素进行分区,比基准元素大的元素放在它的右边,比其小的放在它的左边;

           3.对左右两个分区重复以上步骤直到所有元素都是有序的。

     

    所以我是把快速排序联想成东拆西补西拆东补一边拆一边补,直到所有元素达到有序状态。

                                      

     

                                      

    6.对元素5两边的元素也重复以上操作,直到元素达到有序状态。

    算法实现:

     

    public class QuickSort {

     

        public static void quickSort(int arr[],int _left,int _right){

            int left = _left;

            int right = _right;

            int temp = 0;

            if(left <= right){   //待排序的元素至少有两个的情况

                temp = arr[left];  //待排序的第一个元素作为基准元素

                while(left != right){   //从左右两边交替扫描,直到left = right

                    while(right > left && arr[right] >= temp)  

                         right --;        //从右往左扫描,找到第一个比基准元素小的元素

                      arr[left] = arr[right];  //找到这种元素arr[right]后与arr[left]交换

                    while(left < right && arr[left] <= temp)

                         left ++;         //从左往右扫描,找到第一个比基准元素大的元素

                      arr[right] = arr[left];  //找到这种元素arr[left]后,与arr[right]交换

                }

                arr[right] = temp;    //基准元素归位

                quickSort(arr,_left,left-1);  //对基准元素左边的元素进行递归排序

                quickSort(arr, right+1,_right);  //对基准元素右边的进行递归排序

            }        

        }

        public static void main(String[] args) {

            int array[] = {10,5,3,1,7,2,8};

            System.out.println("排序之前:");

            for(int element : array){

                System.out.print(element+" ");

            }

            

            quickSort(array,0,array.length-1);

            System.out.println(" 排序之后:");

            for(int element : array){

                System.out.print(element+" ");

            }

     

        }

     

    }

     

    排序结果:

    排序之前:

    10 5 3 1 7 2 8

    排序之后:

    1 2 3 5 7 8 10

    算法分析:1.当分区选取的基准元素为待排序元素中的最大或最小值时,为最坏的情况,时间复杂度和直接插入排序的一样,移动次数达到最大值

                      Cmax = 1+2+...+(n-1) = n*(n-1)/2 = O(n2) 此时最好时间复杂为O(n2

                  2.当分区选取的基准元素为待排序元素中的"中值",为最好的情况,时间复杂度为O(nlog2n)

                  3.快速排序的空间复杂度为O(log2n). 

                  4.当待排序元素类似[6,1,3,7,3]且基准元素为6时,经过分区,形成[1,3,3,6,7],两个3的相对位置发生了改变,所是快速排序是一种不稳定排序。

     

     

     

  • 相关阅读:
    深入理解Java容器——HashMap
    深入理解Java并发容器——ConcurrentHashMap
    String、StringBuilder和StringBuffer的比较
    接口类、抽象类和普通类的区别
    跟我一起学算法——二项堆
    跟我一起学算法——分治法
    跟我一起学算法——动态规划
    跟我一起学算法——斐波那契堆
    Redis操作三部曲:SpringBoot2.0.X集成Redis + Redis分布式锁 + RedisCacheManager配置
    SpringBoot使用Redis做集中式缓存
  • 原文地址:https://www.cnblogs.com/tangxz/p/7750854.html
Copyright © 2020-2023  润新知