प्रत्येक छँटाई एल्गोरिथ्म का उपयोग कब किया जाता है? [बन्द है]


170

जब किसी विशेष सॉर्टिंग एल्गोरिथ्म को दूसरों पर पसंद किया जाता है तो क्या उपयोग के मामले होते हैं - मर्ज सॉर्ट बनाम क्विकॉर्ट वर्सेस हेस्पोर्ट बनाम 'इंट्रो सॉर्ट', आदि?

क्या आकार, डेटा संरचना, उपलब्ध मेमोरी और कैश, और CPU प्रदर्शन के आधार पर उनका उपयोग करने में एक अनुशंसित मार्गदर्शिका है?


विभिन्न प्रकार के डेटा और एल्गोरिदम के लिए एनिमेशन का एक सेट <a href=" Sorting-algorithms.com/"> सॉर्टिंग-algorithms.com </ a > पर लिया जा सकता है
चिप Uni

2
इस सामान के लिए bigocheatsheet.com जैसा एक गाइड होगा greaaaat
K - SO में विषाक्तता बढ़ रही है।

@ChipUni यहां तय लिंक है: toptal.com/developers/sorting-algorithms
eric

2
यह सवाल क्यों बंद हो गया है ?!
अरवंद

जवाबों:


316

पहला, एक परिभाषा, क्योंकि यह बहुत महत्वपूर्ण है: एक स्थिर प्रकार वह है जो समान कुंजियों के साथ तत्वों को फिर से नहीं करने की गारंटी है।

अनुशंसाएँ:

त्वरित सॉर्ट: जब आपको स्थिर सॉर्ट और औसत केस प्रदर्शन की आवश्यकता नहीं होती है तो यह सबसे खराब केस प्रदर्शन से अधिक होता है। एक त्वरित प्रकार ओ (एन लॉग एन) औसतन, सबसे खराब स्थिति में ओ (एन ^ 2) है। एक अच्छा कार्यान्वयन हे (लॉग एन) सहायक भंडारण को पुनरावर्तन के लिए स्टैक स्पेस के रूप में उपयोग करता है।

मर्ज सॉर्ट करें: जब आपको एक स्थिर, ओ (एन लॉग एन) सॉर्ट की आवश्यकता होती है, तो यह आपके एकमात्र विकल्प के बारे में है। इसके लिए केवल डाउनसाइड यह है कि यह O (N) सहायक स्थान का उपयोग करता है और त्वरित सॉर्ट की तुलना में थोड़ा बड़ा है। कुछ इन-प्लेस मर्ज प्रकार हैं, लेकिन AFAIK वे सभी ओ (एन लॉग एन) की तुलना में स्थिर या बदतर नहीं हैं। यहां तक ​​कि ओ (एन लॉग एन) भी जगह में पुराने मैरिज सॉर्ट की तुलना में इतना बड़ा है कि वे उपयोगी एल्गोरिदम की तुलना में अधिक सैद्धांतिक जिज्ञासाएं हैं।

ढेर सॉर्ट: जब आपको एक स्थिर प्रकार की आवश्यकता नहीं होती है और आप औसत केस प्रदर्शन की तुलना में सबसे खराब मामले के प्रदर्शन की परवाह करते हैं। यह O (N लॉग एन) होने की गारंटी है, और O (1) सहायक स्थान का उपयोग करता है, जिसका अर्थ है कि आप अप्रत्याशित रूप से बहुत बड़े इनपुट पर ढेर या स्टैक स्पेस से बाहर नहीं भागेंगे।

इंट्रोसोर्ट: यह एक त्वरित सॉर्ट है जो त्वरित सॉर्ट के O (N ^ 2) सबसे खराब स्थिति के आसपास प्राप्त करने के लिए एक निश्चित पुनरावृत्ति गहराई के बाद ढेर सॉर्ट पर स्विच करता है। गारंटीकृत ओ (एन लॉग एन) प्रदर्शन के साथ, यह एक सादे पुराने त्वरित प्रकार से लगभग हमेशा बेहतर होता है, क्योंकि आपको एक त्वरित प्रकार का औसत मामला मिलता है। संभवतः इसके बजाय ढेर के प्रकार का उपयोग करने का एकमात्र कारण गंभीर मेमोरी की कमी वाली प्रणालियों में है जहां ओ (लॉग एन) स्टैक स्थान व्यावहारिक रूप से महत्वपूर्ण है।

सम्मिलन प्रकार : जब N को छोटा होने की गारंटी दी जाती है, जिसमें एक त्वरित प्रकार या मर्ज प्रकार का आधार मामला शामिल होता है। जबकि यह O (N ^ 2) है, इसमें बहुत छोटा स्थिरांक है और यह एक स्थिर प्रकार है।

बबल सॉर्ट, सेलेक्शन सॉर्ट : जब आप कुछ जल्दी और गंदा कर रहे हों और किसी कारण से आप सिर्फ मानक लाइब्रेरी की छँटाई एल्गोरिथ्म का उपयोग न कर सकें। केवल प्रविष्टि के आधार पर होने वाले इन लाभों को लागू करने के लिए थोड़ा आसान किया जा रहा है।


गैर-तुलनात्मक प्रकार: कुछ काफी सीमित स्थितियों के तहत ओ (एन लॉग एन) बाधा को तोड़ना और ओ (एन) में सॉर्ट करना संभव है। यहाँ कुछ मामले हैं जहाँ यह एक कोशिश के लायक है:

काउंटिंग सॉर्ट: जब आप एक सीमित सीमा के साथ पूर्णांकों को सॉर्ट कर रहे हैं।

मूलांक सॉर्ट: जब लॉग (N) K की तुलना में काफी बड़ा होता है, जहां K मूलांक अंकों की संख्या होती है।

बकेट सॉर्ट: जब आप गारंटी दे सकते हैं कि आपका इनपुट लगभग समान रूप से वितरित है।


1
जैसा कि मुझे याद है, हीप सॉर्ट में भी एक बहुत ही पूर्वानुमानित चलने का समय होता है, जिसमें एक ही आकार के विभिन्न आदानों के बीच थोड़ा बदलाव होता है, लेकिन इसकी निरंतर जगह से कम ब्याज होता है। मुझे यह भी लगता है कि एन ^ 2 प्रकार के कार्यान्वयन के लिए प्रविष्टि सॉर्ट करना सबसे आसान है, लेकिन शायद यह सिर्फ मेरे लिए है। अंत में, आप शेल सॉर्ट का भी उल्लेख करना चाह सकते हैं, जो प्रविष्टि सॉर्ट के रूप में लागू करने के लिए लगभग सरल है, लेकिन बेहतर प्रदर्शन है, हालांकि अभी भी लॉग एन नहीं है।
जाकोक


2
+1 बहुत दिलचस्प। क्या आप यह समझाने की परवाह करेंगे कि आप "गारंटी ... लगभग समान रूप से वितरित कर सकते हैं।" बाल्टी के लिए क्रमबद्ध करें?
सैम ऑवर्टन

2
त्वरित छँटनी की तुलना में आत्मनिरीक्षण काफी धीमा क्यों होगा? एकमात्र ओवरहेड पुनरावृत्ति की गहराई की गणना कर रहा है, जो नगण्य होना चाहिए। यह केवल पुनरावृत्ति के बाद स्विच करता है यह एक अच्छे त्वरित प्रकार के मामले में होना चाहिए।
dsimcha

2
आप यह उल्लेख करने में विफल हैं कि बबल सॉर्ट का सबसे अच्छा मामला ओ (एन) है!
तारा

33

क्विकॉर्ट आमतौर पर औसत रूप से सबसे तेज है, लेकिन इसमें कुछ बहुत बुरा बुरा मामला व्यवहार है। इसलिए अगर आपको गारंटी देना है कि कोई बुरा डेटा आपको नहीं देता है O(N^2), तो आपको इससे बचना चाहिए।

मर्ज-सॉर्ट अतिरिक्त मेमोरी का उपयोग करता है, लेकिन बाहरी सॉर्टिंग के लिए विशेष रूप से उपयुक्त है (अर्थात बड़ी फाइलें जो मेमोरी में फिट नहीं होती हैं)।

ढेर बनाएं और छांटें जगह में कर सकते हैं और सबसे खराब मामला द्विघात व्यवहार नहीं है, लेकिन ज्यादातर मामलों में औसत से क्विकॉर्ट की तुलना में धीमी है।

जहां एक सीमित सीमा में केवल पूर्णांक शामिल होते हैं, आप इसे बहुत तेज़ बनाने के लिए किसी प्रकार के मूलांक का उपयोग कर सकते हैं।

99% मामलों में, आप पुस्तकालय के प्रकार के साथ ठीक हो जाएंगे, जो आमतौर पर क्विकॉर्ट पर आधारित होते हैं।


6
+1: "99% मामलों में, आप लाइब्रेरी प्रकारों के साथ ठीक रहेंगे, जो आमतौर पर क्विकॉर्ट पर आधारित होते हैं"।
जिम जी।

रैंडमाइज्ड पिवटिंग क्विकॉर्ट को खराब डेटा के बारे में किसी भी गारंटी की आवश्यकता के बिना, सभी व्यावहारिक उद्देश्यों के लिए ओ (नॉग्लन) का रनटाइम देता है। मैं वास्तव में किसी को भी किसी भी उत्पादन कोड के लिए एक हे (n ^ 2) quicksort लागू नहीं लगता है।
MAK

2
मेक, को छोड़कर, कहते हैं, सी मानक पुस्तकालय qsort? ( google.com/codesearch/… ) - जिस पर अधिकांश "उत्पादन कोड" प्रकार निर्भर करते हैं
एली बेंडस्की

लाइब्रेरी सॉर्ट व्यर्थ रूप से क्विकॉर्ट पर आधारित नहीं है, क्योंकि यह स्थिर नहीं है। लगभग सभी उच्च भाषाएँ (C की अपेक्षा) एक स्थिर क्रम प्रदान करती हैं। ज्यादातर मामलों में मुझे पता है कि आपको एक स्थिर, या कम से कम एक नियतात्मक, प्रकार की आवश्यकता है।
12431234123412341234123


3

तुलना / एनिमेशन के लिए प्रदान किए गए लिंक पर विचार नहीं किया जाता है जब डेटा की मात्रा उपलब्ध स्मृति से अधिक होती है --- जिस समय डेटा पर पास की संख्या, यानी I / O- लागत, रनटाइम पर हावी होती है। यदि आपको ऐसा करने की आवश्यकता है, तो "बाहरी सॉर्टिंग" पर पढ़ें जो आमतौर पर मर्ज के वेरिएंट को कवर करते हैं- और ढेर को सॉर्ट करते हैं।

http://corte.si/posts/code/visualisingsorting/index.html और http://corte.si/posts/code/timsort/index.html में भी कुछ शांत चित्र हैं जो विभिन्न छँटाई वाले एल्गोरिदम की तुलना करते हैं।


0

@dsimcha ने लिखा: काउंटिंग सॉर्ट: जब आप पूर्णांक को एक सीमित सीमा के साथ सॉर्ट कर रहे हैं

मैं इसे बदलूंगा:

गिनती की तरह: जब आप सकारात्मक पूर्णांक को सॉर्ट करते हैं (0 - Integer.MAX_VALUE-2 कबूतर के कारण)।

आप हमेशा रैखिक समय में भी दक्षता के रूप में अधिकतम और न्यूनतम मान प्राप्त कर सकते हैं।
इसके अलावा, आपको मध्यवर्ती सरणी के लिए कम से कम n अतिरिक्त स्थान चाहिए और यह स्पष्ट रूप से स्थिर है।

/**
* Some VMs reserve some header words in an array.
* Attempts to allocate larger arrays may result in
* OutOfMemoryError: Requested array size exceeds VM limit
*/
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

(भले ही यह वास्तव में MAX_VALUE-2 को अनुमति देगा) देखें: क्या जावा सरणियों का अधिकतम आकार है?

इसके अलावा मैं समझाता हूं कि एन कीज़ के लिए रेडिक्स सॉर्ट जटिलता ओ (wn) है जो शब्द आकार w के पूर्णांक हैं। कभी-कभी w को एक स्थिरांक के रूप में प्रस्तुत किया जाता है, जो रेडिक्स सॉर्ट को बेहतर (पर्याप्त रूप से बड़े n के लिए) सर्वश्रेष्ठ तुलना-आधारित सॉर्टिंग एल्गोरिदम की तुलना में बेहतर बनाता है, जो सभी n कुंजी को सॉर्ट करने के लिए O (n लॉग एन) तुलना करते हैं। हालाँकि, सामान्य तौर पर w को एक स्थिरांक नहीं माना जा सकता है: यदि सभी n कीज़ अलग हैं, तो w को कम से कम लॉग एन होना चाहिए ताकि रैंडम-एक्सेस मशीन उन्हें मेमोरी में स्टोर करने में सक्षम हो, जो कि सबसे अच्छा समय जटिलता ओ देता है (एन लॉग एन)। (विकिपीडिया से)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.