java浅度解析快速排序

来源:互联网 发布:天互数据 图片 编辑:程序博客网 时间:2024/06/09 16:39

基本思想:快速排序是在冒泡排序的基础上改进而来的,它是基于分治的思想。通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,使得整个数据变成有序序列。
性能分析:
快速排序的效率与划分是否对称有关,而后者又与选择哪一个元素进行划分有关。最坏情况下,时间复杂度为O(n^2),此时两个区域分别包含n-1个元素和0个元素。最好的情况下,时间复杂度为O(nlog2n)。由于快速排序是递归的,需要一个栈来存放每一层递归调用的必要信息,最大容量与递归调用的深度一致。空间复杂度最好的情况为O(log2n),最坏的情况为O(n)。平均情况下,为O(log2n)。它是一种不稳定的排序

static void quickSort(int[] a,int l,int r)    {        if(l<r){        int index=Partition(a,l,r);//返回的是已经经过遍历左边第一个数,将数组拆分成两个数组        quickSort(a,l,index-1);//递归遍历左边数组        quickSort(a,index+1,r);//递归遍历右边数组        }    }    static int Partition(int[] a,int begin,int end )    {        int left=begin;        int right=end;        int key=a[left];   //选取一个左边第一个的为基准值        while(left<right)   //从数组两端交替向中间扫描        {            while(a[left]<=key)//从左边开始遍历,一直向右比较,左指针一直++,直到找到值比基准值要大就跳出while            {                left++;//指针往右走            }            while(key<a[right])//比对左边结束之后就开始从右边遍历 ,一直往左边比较,直到找到基准值要小的数就结束while;            {                right--;//指针往左走            }            if(left<right)//这个是理解难点,此时的左指针指向的值是比基准值大的,右指针指向的值是比基准值key小的,所以两个值要互换            {                swap(a,left,right);            }        }                a[begin]=a[right];//程序走到这里表明左指针left和右指针right已经交叉,                                 //遍历已经结束,此时要把基准值和右指针最后指向值位置互换                a[right]=key;                return right;   //并且返回作为一个新的左边基准值       }

4.详细解析
①初始化int[] a={5,2,1,7,6,4,3},选定一个基准值key
这里写图片描述

②当在左循环此时left=3时指针指向的7,跳出左边循环
这里写图片描述
③程序继续往下走,来到右循环while,此时a[6]=3

原创粉丝点击