藍橋杯第九屆省賽 快速排序 分治

2021-09-12 17:19:57 字數 1556 閱讀 3590

以下**可以從陣列a中找出第k小的元素。

它使用了類似快速排序中的分治演算法,期望時間複雜度是o(n)的。

請仔細閱讀分析原始碼,填寫劃線部分缺失的內容。

#include

int quick_select(int a, int l, int r, int k)

int i = l, j = r;

while(i < j)

while(i < j && a[j] > x) j--;

if(i < j)

}a[i] = x;

p = i;

if(i - l + 1 == k) return a[i];

if(i - l + 1 < k) return quick_select( _____________________________ ); //填空

else return quick_select(a, l, i - 1, k);

}int main()

;printf("%d\n", quick_select(a, 0, 14, 5));

return 0;

}注意:只填寫劃線部分缺少的**,不要抄寫已經存在的**或符號。

答案:a, i + 1, r, k - (i - l + 1)

#include #include int quick_select(int a, int l, int r, int k) 

int i = l, j = r;

while (i < j)

while (i < j && a[j] > x) j--; //找到右邊第乙個比x值小的數

if (i < j)

} a[i] = x;//比x小值放左邊,比x大值放右邊後,i即為x值

p = i;//這行沒太大作用,加不加都一樣

if (i - l + 1 == k) return a[i]; //比x小的數 + 1 = k,即x為第k小的數

/* 比x小的數 + 1 < k,說明x太小了,應該去比x大的值(x的右邊)裡面再找數[x新]

但不需要再找k - 1個比[x新]小的數,已經確定了(i - 1 + 1)個比[x新]小的值

更新查詢區間為(i + 1, r)

找第k - (i - l + 1)小的數

*/ if (i - l + 1 < k) return quick_select(a, i + 1, r, k - (i - l + 1)); //填空

/* 比x大的數 + 1 > k,說明x太大了,應該去x左邊找[x新]

更新查詢區間(l, i + 1)

找第k小的數

*/ else return quick_select(a, l, i - 1, k);

}int main();

printf("%d\n", quick_select(a, 0, 14, 5));

/*for (int i = 0; i < 15; ++i)

putchar('\n');*/

return 0;

}

第九屆藍橋杯省賽 測試次數

參考 x星球的居民脾氣不太好,但好在他們生氣的時候唯一的異常舉動是 摔手機。各大廠商也就紛紛推出各種耐摔型手機。x星球的質監局規定了手機必須經過耐摔測試,並且評定出乙個耐摔指數來,之後才允許上市流通。x星球有很多高聳入雲的高塔,剛好可以用來做耐摔測試。塔的每一層高度都是一樣的,與地球上稍有不同的是,...

第九屆藍橋杯省賽 方格計數

一 問題描述 如圖所示,在二維平面上有無數個1x1的小方格。我們以某個小方格的乙個頂點為圓心畫乙個半徑為1000的圓。你能計算出這個圓裡有多少個完整的小方格嗎?注意 需要提交的是乙個整數,不要填寫任何多餘內容.二 題目型別 結果填空 列舉 三 解題思路及 怎麼可能這麼簡單!傻啊,情況都沒有考慮清楚,...

第九屆藍橋杯省賽 第五題 快速排序

以下 可以從陣列a中找出第k小的元素。它使用了類似快速排序中的分治演算法,期望時間複雜度是o n 的。請仔細閱讀分析原始碼,填寫劃線部分缺失的內容。注意 只填寫劃線部分缺少的 不要抄寫已經存在的 或符號。include includeint quick select int a,int l,int ...