सरणी में सबसे छोटा / सबसे बड़ा खोजने के लिए सबसे छोटा / सबसे बड़ा संभव शुरू करने की कोई वास्तविक आवश्यकता नहीं है:
double largest = smallest = array[0];
for (int i=1; i<array_size; i++) {
if (array[i] < smallest)
smallest = array[i];
if (array[i] > largest0
largest= array[i];
}
या, यदि आप इसे एक से अधिक बार कर रहे हैं:
#include <utility>
template <class iter>
std::pair<typename iter::value_type, typename iter::value_type> find_extrema(iter begin, iter end) {
std::pair<typename iter::value_type, typename iter::value_type> ret;
ret.first = ret.second = *begin;
while (++begin != end) {
if (*begin < ret.first)
ret.first = *begin;
if (*begin > ret.second)
ret.second = *begin;
}
return ret;
}
नमूना कोड प्रदान करने का नुकसान - मुझे लगता है कि दूसरों ने पहले से ही एक ही विचार का सुझाव दिया है।
ध्यान दें कि जब मानक में एक min_element और max_element होता है, तो इनका उपयोग करके दो बार डेटा के माध्यम से स्कैनिंग की आवश्यकता होती है, जो कि एक समस्या है अगर सरणी बिल्कुल भी बड़ी हो। हाल के मानकों ने इसे जोड़कर संबोधित किया है std::minmax_element
, जो find_extrema
ऊपर के समान है (एक पास में एक संग्रह में न्यूनतम और अधिकतम दोनों तत्व खोजें)।
संपादित करें: अहस्ताक्षरित की एक सरणी में सबसे छोटे गैर-शून्य मान को खोजने की समस्या को संबोधित करना: जब वे चरम पर पहुंचते हैं, तो उन अहस्ताक्षरित मानों को "लपेटें" देखें। सबसे छोटे गैर-शून्य मान को खोजने के लिए, हम तुलना के लिए प्रत्येक को एक से घटा सकते हैं। कोई भी शून्य मान, प्रकार के लिए सबसे बड़ा संभव मान "चारों ओर लपेट" देगा, लेकिन अन्य मूल्यों के बीच संबंध बनाए रखा जाएगा। हमारे द्वारा किए जाने के बाद, हम स्पष्ट रूप से हमारे द्वारा पाए गए मूल्य में एक जोड़ देते हैं।
unsigned int min_nonzero(std::vector<unsigned int> const &values) {
if (vector.size() == 0)
return 0;
unsigned int temp = values[0]-1;
for (int i=1; i<values.size(); i++)
if (values[i]-1 < temp)
temp = values[i]-1;
return temp+1;
}
ध्यान दें कि यह अभी भी प्रारंभिक मूल्य के लिए पहले तत्व का उपयोग करता है, लेकिन हमें अभी भी किसी भी "विशेष मामले" कोड की आवश्यकता नहीं है - क्योंकि यह सबसे बड़ा संभव मूल्य के चारों ओर लपेटेगा, किसी भी गैर-शून्य मान के छोटे होने की तुलना में होगा। परिणाम सबसे छोटा नॉनजरो मूल्य होगा, या 0 यदि और केवल यदि वेक्टर में कोई गैर-शून्य मान नहीं है।