算法复习-快速排序(递归实现)

一.问题描述

       用快速排序的递归方式对数列{1,0,9,6,5,3,2}进行排序。

二.原理概述

       快速排序采用分治的思想,分解问题的规模。其基本思路是从待排序数组中取关键数key,将每个数与Key进行比较,大于key的置于右侧,小于Key的置于右侧,从而达到排序的目的。Key值的选择将大大影响本算法的时间复杂度,经典快速排序一般将Key指定为数组最后一个元素,当数组已经为有序数列,例如{1,2,3,4,5,6},Key值为6,此时,小于Key值得区域和大于Key值的区域长度相差较大,递归的深度将增大,此时复杂度为O(n^2)。所以一般采用随机函数选取Key值,此时复杂度可以保持O(nlogN)。

三.具体实现

       将一个数列分为三个区域,less区,equal区,和more区。在切分函数开始的位置,将less赋值l-1(l为数组最左端元素的地址),more赋值为r(r为数组最右端元素的地址)。从array[l]开始,每次和array[r]相比(array[r]就是Key值)。当l指针还没到more指针指向的位置时:

        1)如果array[l]<array[r],那么swap(++less,l++)。即less区域向外移动一步后,array[less]和array[l]互换,并且l也向右移动一步。

         2)如果array[l]>array[r],那么swap(--more,l)。即more区域向左移动一步后,array[more]和array[l]互换。

         3)如果array[l]==array[r],那么l向右移动一步。

四.代码

    

/***
 * Author:spike Wang
 * Date:2018-6-29
 */
public class QuickSort {
    public static void quick2sort(int array[])                //递归函数入口
    {
        int l=0;
        int r=array.length-1;
        quick2sort(array,l,r);
    }
    public static void quick2sort(int[] array,int l, int r)         //递归函数
    {
       if (l<r) {
           int key = (int) (Math.random() * (r - l+1));              //随机选取Key值
           swap(array,l+ key, r);                                //将Key值移动到最后的位置
           int[] p = partition(array, l, r);
           quick2sort(array, l, p[0] - 1);
           quick2sort(array, p[1] + 1, r);
       }
    }
    public static int[] partition(int[] array,int l, int r)                  //切分函数
    {
        int less=l-1;
        int more=r;
        while(l<more)
        {
            if (array[l]<array[r])                                            //小于Key值,less指针向前一步,l指针向前一步
                swap(array,++less,l++);
           else if (array[l]>array[r])                                       //大于Key值,more指针向后一步
                swap(array,--more,l);
          else l++;                                                          //等于Key值,l指针向前一步
        }
        swap(array,more,r);
        return new int[] {less+1,more};

    }
    public static void swap(int[] array,int l,int r)
    {
        int temp=array[l];
        array[l]=array[r];
        array[r]=temp;
    }

猜你喜欢

转载自blog.csdn.net/qq_34814105/article/details/80861634