快速排序(JAVA描述)

设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
一趟快速排序的算法是:
1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
3)从j开始向前搜索,即由后开始向前搜索(j–),找到第一个小于key的值A[j],将A[j]和A[i]互换;
4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;
5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。

现象:可比较我的其他算法现象
组建数组元素个数:10000000(千万)
组件随机数组运行时间:233ms
排序运行时间:78ms

import java.util.Random;


public class QuitSort {

    public static void show(int [] a){
        for(int i=0;i<a.length;i++){
            System.out.print(a[i]+"、");
        }
        System.out.println();
    }

    public static int[] get_intarr(int len){
        long begin = System.currentTimeMillis();
        Random ran = new Random();
        int [] result = new int[len];
        for(int i=0;i<len;i++){result[i] = ran.nextInt(100); }
        long runtime = System.currentTimeMillis()-begin;
        System.out.println("组建数组元素个数:"+len);
        System.out.println("组件随机数组运行时间:"+runtime);
        return result;
    }

    /**
     * 将a[begin]放在一个位置,左边小于a[begin],右边大于a[begin]
     * @param a 数组
     * @param begin 起始位置[以此为标准]
     * @param end 结束位置
     */
    public static int adjustArray(int []a,int begin,int end){
        int tmp = a[begin];
        int i=begin,j=end;
        while(i<j){
            //从右至左找到小于tmp的数,然后a[i]=a[j],调换位置
            while(i<j && a[j]>=tmp){
                j--;
            }
            if(a[j]<tmp){
                a[i] = a[j];
                i++;
            }

            //从左至右找到大于tmp的数,然后a[j]=a[i],调换位置
            while(i<j && a[i]<=tmp){
                i++;
            }
            if(a[i]>tmp){
                a[j] = a[i];
                j--;
            }
        }
        a[i]=tmp;

        return i;
    }
    /**
     * 递归将begin位置数字放置正确位置,直至begin=last
     * @param a
     * @param begin 
     * @param last 
     */
    public static void quickSort(int []a,int begin,int last){
        if(begin < last){
            int i = adjustArray(a, begin, last);
            adjustArray(a,begin,i-1);
            adjustArray(a, i+1, last);
        }
    }

    public static void main(String[] args) {
        int a[] = get_intarr(10000000);
        long begin = System.currentTimeMillis();
        quickSort(a,0,a.length-1);
        long runtime = System.currentTimeMillis()-begin;
        System.out.println("排序运行时间:"+runtime);
//      show(a);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值