以下**可以從陣列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 ...