交换类排序之快速排序

算法步骤:
假设待划分序列为r[low],r[low+1],……,r[high]。首先将基准记录r[low]移至变量x中,是r[low]相当于空单元,然后反复进行如下两个扫描过程,直到low和high相遇。
1、high从右向左扫描,直到r[high]<x时,将r[high]移至空单元r[low],此时r[high]相当于空单元。
2、low从左向右扫描,直到r[low]>=x时,将r[low]移至空单元r[high],此时r[low]相当于空单元。
当low和high相遇时,r[low](或r[high]) 相当于空单元,且r[low]左边所有记录的关键字均小于基准记录的关键字,而r[low] 右边所有记录的关键字均大于或等于基准记录的关键字。最后将基准记录移至r[low] 中,就完成了一次划分过程。对于r[low] 左边的子表和r[low] 右边的子表可采用同样的方法进一步划分。
示例代码:

public class QuickSort 
{
    public static void qkSort(int arr[],int low,int high){
        if(low<high){
            int pos=qkPass(arr,low,high);   /**/
            qkSort(arr,low,pos-1);
            qkSort(arr,pos+1,high);
        }
    }

    public static int qkPass(int arr[],int low,int high){
        int x=arr[low];      //选择基准记录
        while(low<high){
            while(low<high&&arr[high]>x)   //high从右到左找小于x的记录
                high--;      
            if(low<high){      /*找到小于x的记录,则送入“空单元”r[low]*/
                arr[low]=arr[high];   
                low++;
            }
            while(low<high&&arr[low]<x)    //low从左到右找大于或等于x的记录
                low++;
            if(low<high){              /*找到大于x的记录,则送入“空单元”r[high]*/
                arr[high]=arr[low];
                high--;
            }
        }
        arr[low]=x;      //将基准记录保存到low=high的位置
        for(int i=0;i<arr.length;i++)
            System.out.print(arr[i]+" ");
        System.out.println();
        return low;      //返回值为基准记录的位置
    }

    public static void main(String[] args) 
    {
        int length=(int)(Math.random()*10)+6;
        //System.out.println(length);
        int[] array=new int[length];
        for(int j=0;j<length;j++){
            array[j]=(int)(Math.random()*100);
            //System.out.println(array[j]);
        }
        qkSort(array,0,length-1);
        System.out.println("排序后的序列如下:");
        for(int i=0;i<array.length;i++)
            System.out.print(array[i]+" ");
        System.out.println();
    }
}

算法分析:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值