二种JAVA快速排序算法比较

二种JAVA快速排序算法比较

public class QCTest {

    public static void main(String[] args) {
        List<Integer> l1 = Arrays.asList(45,671,9,5,3,7,0,12,2000,34,56,45,21);
        l1 = QCTest.seq1(l1);
        System.out.println(l1);

        Integer[] l = {41,671,9,5,3,7,0,12,2000,34,56,45,21};
        //System.out.println(Arrays.asList(l));
        QCTest.seq2(l,0,l.length-1);
        System.out.println(Arrays.asList(l));
    }

    //快速排序
    public static List<Integer> seq1(List<Integer> l){
        Integer i = l.get(0);
        List<Integer> l1 = new ArrayList<>();
        List<Integer> l2 = new ArrayList<>();
        l.subList(1, l.size()).forEach(ll -> {
            if (ll < i) { //取出比他小的
                l1.add(ll);
            } else {     //取出比他大的
                l2.add(ll);
            }
        });
        List<Integer> result = new ArrayList<>();
        if(!CollectionUtils.isEmpty(l1)){
            result.addAll(seq1(l1));
        }
        result.add(i);
        if(!CollectionUtils.isEmpty(l2)){
            result.addAll(seq1(l2));
        }
        return result;
    }

    //此方法比方法1节省空间。每次调用不需要重新分配二个队列
    public static void seq2(Integer[] l, int low, int high) {
        if(low > high){
            return;
        }
        int first = l[low],temp;
        int i = low ;
        int j = high;
        while (j > i) {
            while (l[j] >= first && j > i) {
                j--;
            }
            while (l[i] <= first && j > i) {
                i++;
            }
            //System.out.println(j+"--"+i);
            if (j > i) {
                temp = l[j];
                l[j] = l[i];
                l[i] = temp;
            }
            //System.out.println(Arrays.asList(l));
        }
        l[low] = l[i];
        l[i] = first;
        seq2(l, low, i-1);
        seq2(l, j+1, high);
    }

//方法3
public static void sort(List<Integer> l){
        if(l.size() < 2){
            return;
        }
        int mid = l.get(0);
        int fangXiang = 0; //0 表向左,1表向右
        int left =0 ,wright = l.size()-1;
        int currentIndex = 0;
        while (left < wright){
            if(fangXiang == 0){
                if(l.get(wright) < mid){
                    int tmep = l.get(wright);
                    l.set(wright, mid);
                    l.set(left, tmep);
                    fangXiang = 1;
                    currentIndex = wright;
                }else {
                    wright--;
                }
            }

            if(fangXiang == 1){
                if(l.get(left) > mid){
                    int tmep = l.get(left);
                    l.set(left, mid);
                    l.set(wright, tmep);
                    fangXiang = 0;
                    currentIndex = left;
                }else {
                    left++;
                }
            }
        }
        sort(l.subList(0, currentIndex));
        sort(l.subList(currentIndex+1, l.size() ));
    }

}

方法2比方法1节省空间,每次调用不需要重新分配二个队列,效率更高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值