演算法 查詢陣列第i小的元素的演算法

2021-07-22 08:07:31 字數 930 閱讀 6171

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大的...