जावा की Arrays.sort
विधि प्राइमेटिव के सरणी के लिए क्विक्सोर्ट का उपयोग करती है और वस्तुओं के सरणी के लिए क्रमबद्ध करती है। मेरा मानना है कि अधिकांश समय क्विक्सोर्ट विलय की तुलना में तेज़ है और कम मेमोरी खर्च करता है। मेरे प्रयोग इसका समर्थन करते हैं, हालांकि दोनों एल्गोरिदम ओ (एन लॉग (एन) हैं)। तो अलग-अलग प्रकार के लिए अलग-अलग एल्गोरिदम क्यों उपयोग किए जाते हैं?जावा की Arrays.sort विधि विभिन्न प्रकार के लिए दो अलग सॉर्टिंग एल्गोरिदम का उपयोग क्यों करती है?
उत्तर
सबसे संभावित कारण: quicksort स्थिर नहीं है, यानी समान प्रविष्टियां इस प्रकार के दौरान अपनी सापेक्ष स्थिति बदल सकती हैं; अन्य चीजों के साथ, इसका मतलब यह है कि यदि आप पहले से सॉर्ट किए गए सरणी को सॉर्ट करते हैं, तो यह अपरिवर्तित नहीं रह सकता है।
चूंकि आदिम प्रकारों की कोई पहचान नहीं है (एक ही मूल्य के साथ दो चींटियों को अलग करने का कोई तरीका नहीं है), इससे कोई फर्क नहीं पड़ता। लेकिन संदर्भ प्रकारों के लिए, यह कुछ अनुप्रयोगों के लिए समस्याएं पैदा कर सकता है। इसलिए, उन लोगों के लिए एक स्थिर विलय प्रकार का उपयोग किया जाता है।
ओटीओएच, उपयोग करने के लिए एक कारण (गारंटीकृत एन * लॉग (एन)) आदिम प्रकारों के लिए विलय प्रकार हो सकता है कि यह सरणी के क्लोन बनाने की आवश्यकता हो। संदर्भ प्रकारों के लिए, जहां संदर्भित वस्तुएं आमतौर पर संदर्भों की सरणी की तुलना में कहीं अधिक स्मृति लेती हैं, यह आम तौर पर कोई फर्क नहीं पड़ता। लेकिन प्राचीन प्रकार के लिए, सरणी को क्लोन करने से स्मृति उपयोग को दोगुना कर दिया जाता है।
क्विकॉर्ट का उपयोग करने का एक और कारण यह है कि औसत मामले में, क्विकॉर्ट मर्जिसोर्ट से तेज़ है। हालांकि Quicksort विलय से अधिक तुलना करता है, यह बहुत कम सरणी उपयोग करता है। 3-तरफा क्विकॉर्ट भी रैखिक समय प्राप्त कर सकता है यदि इनपुट में बहुत सी डुप्लिकेट प्रविष्टियां होती हैं जो व्यावहारिक अनुप्रयोगों में असामान्य नहीं होती हैं (मेरा अनुमान है कि दोहरी पिवट त्वरित-क्रम में भी यह संपत्ति है)। आज के लिए इंटरनेट पर मेरी पसंदीदा साइट के लिए –
एक कारण यह है कि मैं के बारे में सोच सकते हैं, जबकि mergesort हे की सबसे खराब स्थिति समय (n लॉग एन) को बरकरार रखे हुए quicksort हे की एक सबसे खराब स्थिति समय जटिलता (n^2) किया है। ऑब्जेक्ट एरे के लिए एक उचित उम्मीद है कि कई डुप्लिकेट ऑब्जेक्ट संदर्भ होंगे जो एक ऐसा मामला है जहां क्विकॉर्ट सबसे खराब होता है।
एक सभ्य visual comparison of various algorithms है, विभिन्न एल्गोरिदम के लिए दाएं सबसे अधिक ग्राफ पर विशेष ध्यान दें।
मैं एल्गोरिथम पर व्याख्यान प्रोफेसर बॉब Sedgewick जावा प्रणाली प्रकार के लिए मूल्यांकन उल्लेख में से एक में Coursera वर्ग ले रहा था:
"एक प्रोग्रामर वस्तुओं का उपयोग कर रहा है, तो हो सकता है अंतरिक्ष नहीं एक गंभीर रूप से महत्वपूर्ण है मर्ज सॉर्ट द्वारा उपयोग की जाने वाली अतिरिक्त जगह और कोई समस्या नहीं है। और यदि कोई प्रोग्रामर आदिम प्रकार का उपयोग कर रहा है, तो शायद प्रदर्शन सबसे महत्वपूर्ण बात है ताकि वे त्वरित प्रकार का उपयोग कर सकें। "
यह मुख्य कारण नहीं है। उस वाक्य के ठीक बाद एक सवाल था, "संदर्भ प्रकारों के लिए क्यों मर्जोर्ट का उपयोग किया जाता है?" (क्योंकि यह स्थिर है)। मुझे लगता है कि सेडगेविक ने इसका उल्लेख नहीं किया कि वीडियो में इसे प्रश्न के लिए छोड़ दें। – likern
जावा 7 एपीआई वस्तु सरणियों के लिए this answer, Arrays#Sort()
में उद्धृत डॉक्स के अनुसार अब TimSort का उपयोग करता है, जो MergeSort और InsertionSort के एक संकर है। दूसरी ओर, Arrays#sort()
आदिम सरणी के लिए अब Dual-Pivot QuickSort का उपयोग करता है। इन परिवर्तनों को जावा SE में शुरू से लागू किया गया 7.
जावा के Arrays.sort
विधि quicksort, प्रविष्टि प्रकार और mergesort उपयोग करता है। ओपनजेडीके कोड में कार्यान्वित एक एकल और दोहरी पिवोट क्विकॉर्ट भी है। सबसे तेज़ सॉर्टिंग एल्गोरिदम परिस्थितियों पर निर्भर करता है और विजेता हैं: छोटे सरणी (47 वर्तमान में चुने गए) के लिए सम्मिलन क्रम, ज्यादातर क्रमबद्ध सरणी के लिए विलय, और शेष सरणी के लिए क्विकॉर्ट, ताकि जावा के Array.sort() को सर्वोत्तम एल्गोरिदम चुनने का प्रयास किया जा सके उन मानदंडों के आधार पर आवेदन करें।
- 1. रूबी की सॉर्ट विधि किस एल्गोरिदम का उपयोग करती है?
- 2. जावा Arrays.sort
- 3. जावा: Arrays.sort quicksort और mergesort
- 4. विभिन्न परिदृश्यों में सी #/.NET के लिए सर्वश्रेष्ठ सॉर्टिंग एल्गोरिदम
- 5. जावा की कॉन्सैट() विधि कुछ भी क्यों नहीं करती है?
- 6. Java.util.ArrayList.sort() सॉर्टिंग एल्गोरिदम
- 7. सॉर्टिंग एल्गोरिदम के पास - कब उपयोग करें?
- 8. किस सॉर्टिंग एल्गोरिदम qsort उपयोग करता है?
- 9. सॉर्टिंग एल्गोरिदम चुनने के लिए मानदंड क्या हैं?
- 10. दो अलग-अलग प्रकार के सेट के लिए set_intersection
- 11. जावा में .indexOf विधि के लिए एल्गोरिदम का विकल्प
- 12. विधि के लिए प्रकार तर्कों का उपयोग
- 13. समान क्वेरी विभिन्न इंडेक्स का उपयोग करती है?
- 14. मैपडबेट बफर का सरणी() विधि क्यों काम नहीं करती है?
- 15. जावा में जेनिक्स और सॉर्टिंग
- 16. विभिन्न प्रकार की सूची?
- 17. जावा में विभिन्न प्रकार के लिए एक सामान्य वर्ग के स्थिर सदस्य अलग-अलग हैं?
- 18. प्रत्येक सॉर्टिंग एल्गोरिदम का उपयोग कब किया जाता है?
- 19. "ज्यामिति()" विधि देरी के साथ क्यों काम करती है?
- 20. सी ++: टाइप दो सुरक्षा के प्रकारों को अलग करने के लिए प्रकार सुरक्षा का उपयोग
- 21. जावा: यह स्वैप विधि क्यों काम नहीं करती है?
- 22. जावा संग्रह का उपयोग करके विभिन्न प्रकार की वस्तुओं की तुलना करें और क्रमबद्ध करें
- 23. जावा: प्रीफिक्स्ड स्ट्रिंग्स (ऐरेलिस्ट्स) की ट्रिकी सॉर्टिंग
- 24. क्यों toString() विधि जावा
- 25. PHP किस प्रकार का एल्गोरिदम उपयोग करता है?
- 26. रन गिट मर्ज एल्गोरिदम दो अलग-अलग फाइलों पर
- 27. जावा की हैशकोड() विधि कैसे काम करती है?
- 28. आंशिक सॉर्टिंग एल्गोरिदम
- 29. लिंक: दो अलग-अलग प्रकार के शब्दकोशों को छोड़कर
- 30. एसटीएल की सूची :: सॉर्ट() द्वारा किस सॉर्टिंग एल्गोरिदम का उपयोग किया जाता है?
क्विक्सोर्ट सबसे खराब मामला एन^2 नलॉग नहीं है। – codaddict
रुको, क्या होता है यदि आपके पास 'इंटीगर या कुछ' की सरणी है? –
क्या आपके द्वारा पढ़े गए स्रोत में * समझाया नहीं गया है? –