Java实现第九届蓝桥杯快速排序

快速排序

以下代码可以从数组a[]中找出第k小的元素。

它使用了类似快速排序中的分治算法,期望时间复杂度是O(N)的。

请仔细阅读分析源码,填写划线部分缺失的内容。

package bb;
import java.util.Random;
public class JB18_5快速排序 {
    public static int quickSelect(int a[], int l, int r, int k) {
        Random rand = new Random();
        int p = rand.nextInt(r - l + 1) + l;
        int x = a[p];
        int tmp = a[p];
        a[p] = a[r];
        a[r] = tmp;
        int i = l, j = r;
        while (i < j) {
            while (i < j && a[i] < x)
                i++;
            if (i < j) {
                a[j] = a[i];
                j--;
            }
            while (i < j && a[j] > x)
                j--;
            if (i < j) {
                a[i] = a[j];
                i++;
            }
        }
        a[i] = x;
        p = i;
        if (i - l + 1 == k)// (1)说明到底了
            return a[i];
        if (i - l + 1 < k)
            return quickSelect(a, i + 1, r, k - i + l - 1); // 填空
        // qsort(a, i + 1, right);
        // (3)先试试k,
        // (4)再考虑:k要移动到等于(i - l + 1),试试k-(i - l + 1)
        else
            // i - l + 1 > k
            return quickSelect(a, l, i - 1, k);// (2)qsort(a, left, i -
                                                // 1);对上了,k不变
    }
    public static void main(String args[]) {
        int[] a = { 1, 4, 2, 8, 5, 7 };
        System.out.println(quickSelect(a, 0, 5, 4));
        // int [] a = {1, 4, 2, 8, 5, 7, 23, 58, 16, 27, 55, 13, 26, 24, 12, 2};
        // System.out.println(quickSelect(a, 0, a.length-1, 6));
    }
}
posted @ 2019-07-28 12:30  南墙1  阅读(11)  评论(0编辑  收藏  举报