1.乙個思路:怎麼同時找出乙個陣列的最大值和最小值,越快越好?
1.1 一種最普通的辦法是設max = min = a[0],遍歷一遍陣列a,每個元素分別和max,min做比較,並對這兩個值進行相應的更新,這樣的話,比較次數為 2*(n-1)
1.2 這次,把這個陣列的元素分成每兩個元素一對,先不考慮奇偶性,然後這兩個數先進行比較,比出大小,然後大的再和max比較,小的再和min比較,則每兩個數只要進行3次比較,總共比較次數為 2*(n-2)/3 次
2.尋找陣列第i小的元素的(期望為)線性的演算法
有點類似於快排,但是只處理劃分的一邊,不管另外一邊
#include using namespace std;
// 這個函式的作用是將陣列a從下標p到r這部分進行乙個劃分
// 將a[r]放到合理的位置(下標q處),使得 任意 p<=i= a[q]
// 與快排演算法相同
int partition ( int* a, int p, int r )
}a[r] = a[i+1];
a[i+1] = x;
return i+1;
}// 從陣列a[p...r]中找出第i小的元素
int randomized_select ( int* a, int p, int r, int i )
int q = partition(a,p,r);
int k = q - p + 1;
if ( i == k )
else if ( i < k )
else
}int main()
; int len = sizeof(a) / sizeof(int);
for ( int i = 1; i <= len; ++i )
return 0;
}
PHP 查詢陣列第i小元素
1 隨機選擇第i小的數字,用隨機快排實現34 交換元素 5function swap arr,i,j 1011 隨機劃分 12function randomized partition arr,begin,end 1718 劃分19 function partition arr,begin,end ...
分治演算法四(查詢第K小元素)
1.問題描述 對於乙個非有序的陣列a start.end 求陣列中第k小的元素 2.解決思路 最直觀的的方式,先對陣列排序,複雜度為o nlgn 但是這樣複雜度太大,可以利用快速排序的思路,解決這個問題,並且複雜度為o n 關鍵在於劃分只乙個部分,我們知道快速排序選擇乙個pivot對陣列進行劃分,左...
分治演算法求陣列第k小元素
在 陣列s中查詢第k小的元素並輸出 分治演算法 將s分為多個組q,每組5個元素,有剩餘的話,則排序剩餘元素。將q個組單獨排序,每組找出中項,中項組成集合m,以m中項n作為標準,將s劃分為兩個子陣列s1和s2,把這個陣列中比n小的都放入s1的陣列中,陣列s1的元素個數是 s1 個 把這個陣列中比n大的...