2018年藍橋杯java b組第五題


標題:快速排序

以下代碼可以從數組a[]中找出第k小的元素。


它使用了類似快速排序中的分治算法,期望時間復雜度是O(N)的。


請仔細閱讀分析源碼,填寫划線部分缺失的內容。

我在使用(a, l, r, k - 1)時候,有時可以過編譯,有時不行,當時時間比較緊,也就沒有接着想,留坑

import java.util.Random;

public class Main {
    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)
            return a[i];
        if (i - l + 1 < k)
            return quickSelect(a, l, r, k - 1); // 填空
        else
            return quickSelect(a, l, 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));
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM