快速排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速排序相关的知识,希望对你有一定的参考价值。

图解快速排序

 

快速排序是由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("\\n排序之后:");

        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的相对位置发生了改变,所是快速排序是一种不稳定排序。

 

 

 





以上是关于快速排序的主要内容,如果未能解决你的问题,请参考以下文章

深度解析(十六)快速排序

快速排序

基于快速排序方法改成求第k大的数

简单介绍一下快速排序的思想?

用C语言编程实现快速排序算法

Python实现排序算法之快速排序