आश्चर्य की बात यह है कि यह तब भी महत्वपूर्ण हो जाता है जब क्विकॉर्ट को जंगली असंतुलित विभाजनों से सामना नहीं किया जाता है, और यहां तक कि जब इंट्रोसोर्ट वास्तव में उपयोग किया जा रहा हो।
समस्या उत्पन्न होती है (सी ++ में) जब कंटेनर में क्रमबद्ध किए गए मान वास्तव में बड़े होते हैं।इसके द्वारा, मेरा मतलब यह नहीं है कि वे वास्तव में बड़ी वस्तुओं को इंगित करते हैं, लेकिन वे स्वयं वास्तव में बड़े हैं। उस स्थिति में, कुछ (संभवतः कई) कंपाइलर्स रिकर्सिव स्टैक फ्रेम को काफी बड़ा बना देंगे, क्योंकि स्वैप करने के लिए इसे कम से कम एक अस्थायी मान की आवश्यकता होती है। स्वैप को विभाजन के अंदर बुलाया जाता है, जो स्वयं ही रिकर्सिव नहीं होता है, इसलिए आपको लगता है कि क्विकॉर्ट रिकर्सिव ड्राइवर को राक्षस स्टैक-फ्रेम की आवश्यकता नहीं होगी; दुर्भाग्यवश, विभाजन आमतौर पर रेखांकित होता है क्योंकि यह अच्छा और छोटा होता है, और कहीं और से नहीं कहा जाता है।
आम तौर पर 20 और 40 स्टैक फ्रेम के बीच का अंतर नगण्य है, लेकिन यदि मूल्यों का वजन होता है, तो 8kb, तो 20 और 40 स्टैक फ्रेम के बीच का अंतर काम कर सकते हैं और स्टैक ओवरफ्लो के बीच का अंतर हो सकता है, यदि स्टैक्स में हैं कई धागे की अनुमति देने के लिए आकार में कम किया गया है।
आप "हमेशा छोटे विभाजन में recurse" एल्गोरिथ्म का उपयोग करते हैं, ढेर हर लॉग ऑन एन फ्रेम, जहां एन वेक्टर में तत्वों की संख्या है अधिक नहीं हो सकता। इसके अलावा, एन तत्व के आकार से विभाजित स्मृति की मात्रा से अधिक नहीं हो सकता है। तो एक 32-बिट मशीन पर, वहाँ केवल 2 एक सदिश में 8kb तत्व हो सकता है, और quicksort कॉल गहराई 19.
संक्षेप में, quicksort लेखन सही ढंग से अपने ढेर उपयोग करता है से अधिक नहीं हो सकता है उम्मीद के मुताबिक (जब तक आप एक स्टैक फ्रेम के आकार की भविष्यवाणी कर सकते हैं)। अनुकूलन के साथ परेशान कर रहा नहीं (एक भी तुलना को बचाने के लिए!) आसानी से ढेर गहराई भी गैर रोग के मामलों में दोगुना करने के लिए पैदा कर सकता है, और रोग मामलों में यह एक बहुत बदतर हो सकते हैं।
"मैं क्यों quicksort छोटे subarray पर पहले बुलाना चाहिए?" - क्योंकि "पूंछ रिकर्सन के संयोजन के साथ यह सुनिश्चित करता है कि स्टैक गहराई लॉग एन है" –
@ मिच व्हाट हां, लेकिन कैसे? – Moeb
आपने इसे कहां से पढ़ा? – Celeritas