विकिपीडिया कहते हैं, माध्य-Medians की ओ (एन) सैद्धांतिक रूप से है, लेकिन यह व्यवहार में उपयोग नहीं किया जाता है क्योंकि "अच्छा" pivots पाने की भूमि के ऊपर यह बहुत धीमी गति से बनाता है । ,
/**
* Returns position of k'th largest element of sub-list.
*
* @param list list to search, whose sub-list may be shuffled before
* returning
* @param lo first element of sub-list in list
* @param hi just after last element of sub-list in list
* @param k
* @return position of k'th largest element of (possibly shuffled) sub-list.
*/
static int select(double[] list, int lo, int hi, int k) {
int n = hi - lo;
if (n < 2)
return lo;
double pivot = list[lo + (k * 7919) % n]; // Pick a random pivot
// Triage list to [<pivot][=pivot][>pivot]
int nLess = 0, nSame = 0, nMore = 0;
int lo3 = lo;
int hi3 = hi;
while (lo3 < hi3) {
double e = list[lo3];
int cmp = compare(e, pivot);
if (cmp < 0) {
nLess++;
lo3++;
} else if (cmp > 0) {
swap(list, lo3, --hi3);
if (nSame > 0)
swap(list, hi3, hi3 + nSame);
nMore++;
} else {
nSame++;
swap(list, lo3, --hi3);
}
}
assert (nSame > 0);
assert (nLess + nSame + nMore == n);
assert (list[lo + nLess] == pivot);
assert (list[hi - nMore - 1] == pivot);
if (k >= n - nMore)
return select(list, hi - nMore, hi, k - nLess - nSame);
else if (k < nLess)
return select(list, lo, lo + nLess, k);
return lo + k;
}
मैं तुलना और स्वैप तरीकों का स्रोत शामिल नहीं किया है तो यह करना आसान है:
http://en.wikipedia.org/wiki/Selection_algorithm
यहाँ एक Quickselect एल्गोरिथ्म एक सरणी में k'th तत्व को खोजने के लिए के लिए जावा स्रोत है डबल [] के बजाय ऑब्जेक्ट [] के साथ काम करने के लिए कोड को बदलें।
प्रैक्टिस में, आप उपर्युक्त कोड ओ (एन) होने की उम्मीद कर सकते हैं।
स्रोत
2014-12-31 23:09:13
संभव डुप्लिकेट [ओ (एन) में लंबाई एन की एक अनुरक्षित सरणी में kth सबसे बड़ा तत्व कैसे खोजें?] (Http: // stackoverflow .com/प्रश्न/251781/कैसे-से-find-the-kth-big-element-in-an-unsorted-array-of-length-n-in-on) –
ध्यान रखें कि यदि यह O (nlogn) तो आप सरणी को बस क्रमबद्ध कर सकते हैं और इंडेक्स को 2 से विभाजित कर सकते हैं। – Zombies
बिल्डिंग ढेर ओ (एन) समय ओ (nlogn) – JerryGoyal