【手写排序算法及优化】快速排序

java代码

public class QuickSort {
    public static void sort(int[] array)    {
        if(array==null || array.length==1)
            return;
        sort(array,0,array.length-1);

    }

    private static void sort(int[] array,int lo, int hi)    {
        if (lo>=hi)
            return;
        int index = partition(array, lo, hi);
        sort(array,lo,index-1);
        sort(array,index+1,hi);

    }

    private static int partition(int[] array, int lo,int hi)  {

        int i=lo,j=hi+1;
        int val = array[lo];
        while(true)
        {
            while(array[++i]<val)
                if(i==hi)  break;
            while(array[--j]>val)
                if(j==lo)  break;
            if (i>=j)   break;
            swap(array,i,j);
        }
        swap(array, lo, j);
        return j;
    }

    private static void swap(int[] array, int i, int j) {
        int temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }

    public static void main(String args[])  {
        int[] a = new int[]{2,5,1,8,4,5,6};
        int[] b = new int[]{2,5,55,5,8,4,5,6};
        sort(a);
        sort(b);
        System.out.println(a);//通过debug模式可以看到排序结果
        System.out.println(b);
    }
}




 

针对有许多重复值的数组,优化后的三向切分快速排序

public class QuickSort3Way {
    public static void sort(int[] array)    {
        if(array==null || array.length==1)
            return;
        sort(array,0,array.length-1);

    }

    private static void sort(int[] array,int lo, int hi)    {
        if (lo>=hi)
            return;
        int lt = lo, i=lo+1,gt = hi;
        int val = array[lo];
        while (i<=gt)   {
            int cmp = array[i]-val;
            if (cmp<0)  swap(array,lt++,i++);
            else if(cmp>0)  swap(array,i,gt--);
            else    i++;
        }
        sort(array,lo,lt-1);
        sort(array, gt + 1, hi);
    }

    private static void swap(int[] array, int i, int j) {
        int temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }

    public static void main(String args[])  {
        int[] a = new int[]{2,5,1,8,4,5,6};
        int[] b = new int[]{2,5,55,5,8,4,5,6};
        sort(a);
        sort(b);
        System.out.println(a);
        System.out.println(b);
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值