【排序】5.快速排序

快速排序:是对冒泡排序的一种改进

      通过一趟排序将要排序的数据分割为独立的两部分,其中一部分所有数据都比另一部分小,然后递归

public static int[] quicksort(int []a,int left,int right){//快速排序
        int l=left;
        int r=right;
        int flag =0;  
        if(l<=r){
            flag=a[l];   //标记
            while(l!=r){
                while(l<r&&a[r]>=flag){
                    r--;
                }
                a[l]=a[r];//从右往左发现比flag小的,与左边交换
                while(l<r&&a[l]<=flag){
                    l++;
                }
                a[r]=a[l];//从左往右发现比flag大的,与右边交换
            }
            a[l]=flag;
            quicksort(a, left, l-1);    //递归        
            quicksort(a, r+1, right);            
        }
        return a;
    }

快速排序是一种不稳定的排序算法

时间复杂度:当分区选择的元素总为待排元素的最大或最小值时,时间复杂度达到最大,为O(n²)

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

空间复杂度:快速排序的空间复杂度为O(nlog2n)

优化:三平均分区法:不选择待排数组的第一个数作为中轴,而是选择待排数组的最左、最右、中间的三个元素的

          中间值作为中轴

          优点:使得最坏情况的发生几率减小了

             未改进的快速排序算法为了防止比较时数组越界,最后要设置哨点

    根据分区大小调整算法:快速排序对小规模的数据集性能不是很好,当分区规模足够小,就可以停止快速排序,改用其他算法

              在递归排序子分区时,优先排序最小的分区,更加有效的利用存储空间,加速算法的执行

    不同的分区方案考虑:将分区由两块改为三块,一块小于、一块大于、一块等于

              防止相等元素过多

    并行的快速排序:由于快速排序算法是采用分治技术来进行实现的,很容易能够在多台处理机上并行处理

              缺陷:创建一个线程所需要的时间要远远大于两个元素比较和交换的时间

                  分区的这一步骤总是要在子序列并行处理之前完成,限制了并行程度

              改进后的并行快速排序算法使用2n个指针来并行处理分区这一步骤,从而增加算法的并行程度

posted @ 2017-10-21 17:43  chain155  阅读(85)  评论(0)    收藏  举报