快速排序

package com.example.ljia.Structure.Arr;


/**
 * @ Author     :SamLai
 * @ Date       :Created in 2019-04-28 13:54
 * @ Description:快速排序
 * 说明:  Quick Sort也是一个O(nlogn)复杂度的算法
 * 时间复杂度: O(nlogn)
 * 可以在1秒之内轻松处理100万数量级的数据
 */
public class QuickArr {


    public static void main(String[] args) {
        int[] karr = new int[]{12, 2, 23, 9, 18, 34, 67, 90, 110, 8};
        quickSort(karr);
        Qprintln(karr);


        int numCount = 100 * 10000;
        int[] bArr = new int[numCount];
        for (int k = 0, len = bArr.length; k < len; k++) {
            bArr[k] = (int) (1 + Math.random() * (numCount - 1 + 1));
        }
        long s1 = System.currentTimeMillis();
        quickSort(bArr);
        long s2 = System.currentTimeMillis();
//        quickSortPrintln(bArr);
        System.out.println(numCount + "   快速排序时间  :  " + (s2 - s1));
        //百万的排序:120ms 非常的快

    }

    private static void quickSortPrintln(int[] bArr) {
        for (int k = 0, len = bArr.length; k < len; k++) {
            if (k % 100 == 0) {
                System.out.println();
            }
            System.out.print(k + "   ");
        }
    }

    private static void Qprintln(int[] karr) {
        for (int k : karr) {
            System.out.print(k + "   ");
        }
    }




    private static void quickSort(int[] karr) {
        int start = 0, end = karr.length;
        //[0...n]区间
        quickSort(karr, 0, end - 1);
    }

    /**
     * 快排:默认找第一个数v 以v为中间的间隔的内容
     * @param karr
     * @param start
     * @param end
     */
    private static void quickSort(int[] karr, int start, int end) {
        if (start > end) {
            return;
        }
        //获取中间值的坐标内容
        int min = getmid(karr, start, end);
        quickSort(karr, start, min - 1);
        quickSort(karr, min + 1, end);
    }

    // 返回p, 使得arr[l...p-1] < arr[p] ; arr[p+1...r] > arr[p]
    private static int getmid(int[] karr, int start, int end) {
        int v = karr[start];
        int j = start;
        for (int k = start + 1; k <= end; k++) {
            // 5  7  2  6   [0,3]   ===>  5       7  2  6   j=0
            // 5  7         j=0
            // 5  2  7      j=1
            // 5  2  7  6   j=1
            if (karr[k] < v) {
                j++;
                swap(karr, j, k);
            }
        }
        //2  5  7   6
        swap(karr, start, j);
        return j;
    }

    /**
     * 交换数
     * @param karr
     * @param j
     * @param k
     */
    private static void swap(int[] karr, int j, int k) {
        int temp = karr[j];
        karr[j] = karr[k];
        karr[k] = temp;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值