快速排序

快速排序和冒泡排序类似,都是基于交换排序思想。

流程如下:

 1)设定一个分界值,通过该分解值将数组分成左右两部分。

 2)将>=分解值得数据集中到数组右边,<分解值的数据集中到数组左边。此时,左边部分各元素都小于分解值,右边的元素都大于分解值。

 3)然后,利用递归的思想,左右两边分别独立排序。对于左侧的数组数据,在设定一个分界值,重复第2步;同理右边也是如此。

  4)重复上述过程,可以看到一个递归的定义。通过递归将左侧部分排序好,在递归排序右侧部分。当左右两侧都排序完时,整个数组的排序也就完成啦。

举例:

   69、62、89、37、97、17、28、49  对其排序。

    1)取f=array[(0+7)/2]=37为分界值,循环找出左边第一个比f大的元素array[0]=69,循环找出右边第一个比f小的元素array[6]=28。

    2)交换lt和rt的值,此时:28、62、89、37、97、17、69、49,继续往下循环,直到左边没有比f大的,右边没有比f小的,这就分成了左右两部分。

    3)第一次循环结束时,即lt>=rt时,循环结束,此时数组:27、17、37、89、97、62、69、49.

    4)左边:27、17.右边:89、97、62、69、49。分别递归。

  代码:

public static void quickSort2(int[] array,int left,int right){
        int f,t;
        int rtemp,ltemp;
        ltemp = left;
        rtemp = right;
        f = array[(right+left)/2];//取中间数
        
        while(ltemp<rtemp){  //左边小于右边
            while(array[ltemp]<f){
                ltemp++;
            }
            while(array[rtemp]>f){
                rtemp--;
                
            }
            if(ltemp <= rtemp){
                t = array[ltemp];
                array[ltemp] = array[rtemp];
                array[rtemp] = t;
                ltemp++;
                rtemp--;
            }
        }
        if(ltemp == rtemp){
            ltemp++;
        }
        if(left<rtemp){
            quickSort2(array,left,ltemp-1);
        }
        if(ltemp<right){
            quickSort2(array,rtemp+1,right);
        }
        
    }

 

   

你可能感兴趣的:(快速排序)