tl; dr: क्या एक दोगुनी लिंक्ड सूची पर क्विकॉर्ट को प्रभावी ढंग से कार्यान्वित करना संभव है? इसके बारे में सोचने से पहले मेरी समझ थी, नहीं, इसकी नहीं।त्वरित प्रकार की पुनरावृत्तियों की आवश्यकता
दूसरे दिन मुझे मूल सॉर्टिंग एल्गोरिदम के लिए इटरेटर आवश्यकताओं पर विचार करने का अवसर मिला। मूल ओ (एन²) एक काफी सरल हैं।
- बबल सॉर्ट - 2 आगे इटेटरेटर अच्छी तरह से करेंगे, एक दूसरे के बाद खींच रहा है।
- सम्मिलन क्रम - 2 बिडरेक्शनल इटरेटर करेंगे। आउट ऑफ़ ऑर्डर तत्व के लिए एक, सम्मिलन बिंदु के लिए एक।
- चयन क्रम - थोड़ा सा ट्रिकियर लेकिन आगे इटेटरेटर चाल कर सकते हैं।
quicksort
std :: प्रकार में introsort_loop (जीएनयू मानक पुस्तकालय/अश्वशक्ति (1994) के रूप में/सिलिकॉन ग्राफिक्स (1996)) ऐसा करना आवश्यक हो random_access किया जाना है।
__introsort_loop(_RandomAccessIterator __first,
_RandomAccessIterator __last,
_Size __depth_limit, _Compare __comp)
जैसा कि मैंने अपेक्षा की है।
अब नज़दीकी निरीक्षण पर मुझे क्विकॉर्ट के लिए इसकी आवश्यकता के वास्तविक कारण नहीं मिल सकते हैं। केवल एक चीज जो स्पष्ट रूप से random_access_iterators की आवश्यकता है std::__median
कॉल है जिसके लिए मध्य तत्व की गणना की आवश्यकता होती है। नियमित, वेनिला क्विकॉर्ट औसत की गणना नहीं करता है।
विभाजन एक चेक
if (!(__first < __last))
return __first;
नहीं वास्तव में bidirectionals के लिए एक उपयोगी जांच के होते हैं। हालांकि एक
if (__first == __last) this_partitioning_is_done = true;
का एक सरल शर्त के साथ पिछले विभाजन यात्रा (दाएं से बाएं/दाएं से बाएं से) में एक चेक के साथ इस को बदलने के लिए सक्षम होना चाहिए यह संभव quicksort लागू करने के लिए काफी कुशलता से केवल द्विदिश iterators का उपयोग कर है ? रिकर्सिव गहराई अभी भी संरक्षित की जा सकती है।
एनबी। मैंने अभी तक एक वास्तविक कार्यान्वयन का प्रयास नहीं किया है।
सम्मिलन क्रम के लिए, आगे इटरेटर पर्याप्त हैं। आप सम्मिलन को लागू करने के लिए 'std :: rotate' और' std :: upper_bound' के संयोजन का उपयोग कर सकते हैं, और दोनों अवयवों को केवल आगे इटरेटर्स की आवश्यकता होती है। यह अभी भी ओ (एन^2) है। – TemplateRex