Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> Ruby

रूबी में इंसर्शन सॉर्ट को समझना

<ब्लॉकक्वॉट>

नोट:रूबी के साथ विभिन्न सॉर्टिंग एल्गोरिदम को लागू करने पर विचार करने वाली श्रृंखला में यह भाग 4 है। भाग 1 ने बबल सॉर्ट की खोज की, भाग 2 ने चयन प्रकार की खोज की, और भाग 3 ने मर्ज सॉर्ट की खोज की।

जैसा कि हम डेटा सॉर्ट करने के लिए विभिन्न तरीकों का पता लगाना जारी रखते हैं, हम इंसर्शन सॉर्ट की ओर रुख करते हैं। सम्मिलन प्रकार पसंद करने के कई कारण हैं! सबसे पहले, सम्मिलन क्रम स्थिर है , जिसका अर्थ है कि यह समान कुंजियों वाले तत्वों के सापेक्ष क्रम को नहीं बदलता है। यह एक इन-प्लेस एल्गोरिथम भी है , जिसका अर्थ है कि यह सॉर्ट किए गए तत्वों को संग्रहीत करने के लिए एक नई सरणी नहीं बनाता है। अंत में, सम्मिलन क्रम लागू करने के लिए एक बहुत ही सरल एल्गोरिथम है, जैसा कि आप जल्द ही देखेंगे!

क्यों केयर करें

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

एक दृश्य प्रतिनिधित्व

इससे पहले कि हम कोडिंग शुरू करें, मैं निम्नलिखित वीडियो को देखने की अत्यधिक अनुशंसा करता हूं। यह एक नृत्य का उपयोग करते हुए सम्मिलन प्रकार की व्याख्या करता है, और व्यक्तिगत रूप से, मैं इसे पर्याप्त रूप से प्राप्त नहीं कर सकता! :)

रूबी में इंसर्शन सॉर्ट को समझना

कोड का चरण-दर-चरण वॉक-थ्रू

आइए कोड देखें!

def insertion_sort(array)
    for i in 1...(array.length)  # Step 1
        j = i # Step 2
        while j > 0 # Step 3
            if array[j-1] > array[j] # Step 4
                temp = array[j]
                array[j] = array[j-1]
                array[j-1] = temp
            else
                break
            end
            j = j - 1 # Step 5
        end
    end
    return array
end

चरण 1:

हम for . से शुरू करते हैं लूप जो वैरिएबल i . सेट करता है 1 तक और i . तक वृद्धि जारी रखता है हमारे सरणी की लंबाई के बराबर है।

चरण 2:

हम एक और वैरिएबल बनाते हैं j और इसे 1 के मान से प्रारंभ करें (क्योंकि i . यही है है)।

चरण 3:

इसके बाद, हमारे पास एक नेस्टेड while है लूप जो j . तक जारी रहेगा शून्य से बड़ा है। चूंकि हम j . से शुरू करते हैं 1 के बराबर, हम जानते हैं कि यह कम से कम एक बार निष्पादित होगा।

चरण 4:

if... else ब्लॉक शायद पहली बार में डरावना लग रहा है, लेकिन चिंता न करें। एक बार जब हम इसके माध्यम से चलते हैं तो यह समझ में आता है (और आप हमेशा नृत्य YouTube उदाहरण पर फिर से जा सकते हैं!)।

if . के लिए हालत, हम जाँचते हैं कि क्या [j-1] array[j] . से बड़ा है . चूंकि j वर्तमान में 1 है, हम अनिवार्य रूप से array[0] . की तुलना करेंगे array[1] . के साथ . यह समझ में आता है क्योंकि हम सरणी के पहले दो तत्वों की तुलना कर रहे हैं।

यदि पहला तत्व (array[0] ) अगले वाले से बड़ा है (array[1] ), तो निश्चित रूप से हमें स्वैप करने की आवश्यकता है, जो कि if . के भीतर होता है खंड मैथा। हालांकि, अगर array[0] . में मान array[1] . में मान से कम है , फिर बढ़िया! हमें कुछ भी करने की आवश्यकता नहीं है क्योंकि यह पहले से ही क्रमबद्ध है, इसलिए हम बस break दबाते हैं else में ब्लॉक करें।

चरण 5:

यहां से, हम j . घटाते हैं . अब, हम for . पर वापस आ गए हैं लूप, और i अब 2 होने जा रहा है . आप कल्पना कर सकते हैं कि हम array[1] . की तुलना कैसे करेंगे? array[2] . के साथ while . के भीतर पहली पुनरावृत्ति के लिए लूप, और फिर हम वास्तव में while . से गुजरेंगे फिर से लूप करें क्योंकि हमारा j 2 . पर शुरू हुआ बनाम 1

वास्तविक डेटा के साथ उदाहरण

आइए निम्नलिखित उदाहरण सरणी का उपयोग करके इस कोड के माध्यम से चलते हैं:[5,7,2,10,9,12]

पहले पुनरावृत्ति में, हम 5 . की तुलना करेंगे और 7 . चूंकि 5 < 7 , हम जल्दी से if/else . से बाहर निकल जाते हैं और आगे बढ़ें।

अगले पुनरावृत्ति में, हम 7 . की तुलना करते हैं और 2 . अब, इन मानों की अदला-बदली करनी होगी, इसलिए हमारे पास [5, 2, 7, 10, 9, 12] होगा। . फिर, हम 2 . की अदला-बदली करेंगे फिर से 5 . के साथ [2, 5, 7, 10, 9, 12] . के साथ समाप्त करने के लिए ।

अगले पुनरावृत्ति में for . के भीतर लूप, हम तुलना करेंगे 10 और 7 -- वाह! वे पहले से ही क्रम में हैं।

आगे बढ़ते हुए, हम 10 . की तुलना करते हैं और 9 और पाते हैं कि हमें स्वैप करने की आवश्यकता है। फिर, 7 9 . से कम है , इसलिए हमें कोई अन्य स्वैप नहीं करना होगा। अब हमारे पास [2, 5, 7, 9, 10, 12] . बचा है ।

अंतिम पुनरावृत्ति 12 . ढूँढता है , जो 10 . से बड़ा है , तो वोइला! हम कर चुके हैं और क्रमबद्ध हैं।

प्रदर्शन विश्लेषण

जबकि कुछ सॉर्टिंग एल्गोरिदम जिन्हें हमने देखा है, अर्थात् बबल सॉर्ट, वास्तविक जीवन में बहुत कम अभ्यास किया जाता है, सम्मिलन सॉर्ट एक उचित समाधान हो सकता है। कल्पना कीजिए कि अगर हमारी सरणी पहले से ही क्रमबद्ध थी - सम्मिलन क्रम बहुत जल्दी और कुशलता से चलेगा। दूसरी तरफ, क्या होता है यदि हमें एक सरणी को उल्टे क्रम में क्रमबद्ध करने की आवश्यकता होती है। प्रविष्टि क्रम के लिए यह एक दुःस्वप्न की स्थिति होगी।

यदि ऐरे पहले से ही सॉर्ट किया गया है, तो इंसर्शन सॉर्ट कोड O(n) . पर चलेगा चूंकि इसे केवल n . के माध्यम से लूप करना होगा बार। यदि आप इसे सहन करना चाहते हैं, तो एक puts i add जोड़ें विधि के शीर्ष पर और पहले से क्रमबद्ध सरणी में गुजरने वाले प्रोग्राम को चलाएं।

यदि ऐरे को रिवर्स-सॉर्ट किया गया है, तो इंसर्शन सॉर्ट कोड O(n^2) पर चलेगा। आप इसे अपने दिमाग में कल्पना करने में सक्षम हो सकते हैं। चूंकि इसे लगातार स्वैप करना होगा, यह if . पर हिट करेगा हर एक तत्व के लिए शर्त। ओह! फिर से, बेझिझक इसे एक रिवर्स-सॉर्टेड एरे में पास करके आज़माएँ और एक काउंटर वेरिएबल बनाएं जो प्रिंट आउट हो।

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

रैप अप

मुझे उम्मीद है कि यह पोस्ट मददगार रही है और आप सम्मिलन प्रकार के पेशेवरों और विपक्षों को समझने के साथ-साथ एल्गोरिदम कैसे काम करते हैं, इसके बारे में आश्वस्त महसूस करते हैं। यदि आप अभी भी अधिक के लिए खुजली कर रहे हैं, तो मेरा सुझाव है कि सम्मिलन क्रम के लिए विकिपीडिया पृष्ठ देखें।


  1. रूबी के साथ चयन क्रम को समझना

    नोट:यह रूबी के साथ अलग-अलग सॉर्टिंग एल्गोरिदम को देखने वाली श्रृंखला का भाग 2 है। भाग 1 ने बबल प्रकार की खोज की। इस पोस्ट में, मैं रूबी के साथ सिलेक्शन सॉर्ट एल्गोरिथम को लागू करने के तरीके के बारे में बताऊंगा। सिलेक्शन सॉर्ट एक इन-प्लेस तुलना सॉर्टिंग एल्गोरिथम है। इसका मतलब यह है कि सॉर्ट किए ग

  1. रूबी में डुप बनाम क्लोन:अंतर को समझना

    क्या आप जानते हैं कि आप रूबी में किसी वस्तु की प्रतिलिपि बना सकते हैं? इतना ही नहीं, ऐसा करने के दो अलग-अलग तरीके हैं! ये विधियां हैं : dup clone हम एक पल में मतभेदों का पता लगाएंगे, लेकिन पहले… आप किसी वस्तु का क्लोन क्यों बनाना चाहते हैं ? रूबी में कई वस्तुएं परिवर्तनशील हैं, आप उन्हें बदल

  1. रूबी फ्रीज विधि - वस्तु परिवर्तनशीलता को समझना

    किसी वस्तु के परिवर्तनशील होने का क्या अर्थ है? फैंसी शब्दों को भ्रमित न होने दें, “परिवर्तनशीलता ” का सीधा सा मतलब है कि किसी वस्तु की आंतरिक स्थिति को बदला जा सकता है। जमे हुए . को छोड़कर, यह सभी वस्तुओं का डिफ़ॉल्ट है , या वे जो विशेष वस्तुओं की सूची का हिस्सा हैं। दूसरे शब्दों में, रूबी में सभ