मैं एक जेनरिक्स क्लास में रिकर्सिव क्विकस्टोर्ट विधि कार्यान्वयन पर काम कर रहा हूं। मेरे पास एक दूसरी विधि है जो विभिन्न प्रकारों की तुलना करने के लिए एक तुलनात्मक प्रतिनिधि को स्वीकार करता है, लेकिन विकास उद्देश्यों के लिए मैं एक जेनेरिक सूची & lt; int
>।
मुझे अलग तरह से स्टैकेवर्फ फ़्लो क्षेत्रों सूची आकार के आधार पर स्थानों।
मैं घंटों के लिए इस कोड के माध्यम से घूम रहा था और ट्रेसिंग कर रहा था और संभवत: सिर्फ एक ताजा जोड़ी (अधिक अनुभवी) आँखों की जरूरत है मैं निश्चित रूप से यह जानना चाहता हूं कि यह क्यों टूटा हुआ है, इसे ठीक करने के लिए ही नहीं।
सार्वजनिक शून्य QuickSort () {int i, j, lowpos, highpos, pivot; GenericList & LT; टी & gt; LeftList = new genericList & lt; T & gt; (); GenericList & LT; टी & gt; RightList = नया जेनेरिक सूची & lt; T & gt; (); GenericList & LT; टी & gt; TempList = नया जेनेरिक लिस्ट & lt; T & gt; (); कम पोस = 1; HighPos = this.Qount; अगर (कम पीओएस & लेफ्टिनेंट; हाईपोज) {पीवोट = लो पीओ; के लिए (i = 2; i & lt; = highPos; i ++) {यदि (यह [i]। कॉम्परेक्टो (यह [पिवोट]) & lt; = 0) leftList.Add (यह [i]); और सही सूची। जोड़ें (यह [i]); } LeftList.Add (यह [धुएं]); leftList.QuickSort (); rightList.QuickSort (); के लिए (i = 1; i & lt; = leftList.Count; i ++) tempList.Add (बाएं लिस्ट [i]); के लिए (i = 1; i & lt; = rightList.Count; i ++) tempList.Add (सही सूची [i]); This.items = tempList.items; This.count = tempList.count; }}
समाप्त उत्पाद:
सार्वजनिक शून्य QuickSort () {यादृच्छिक यादृच्छिक = नया रैंडम (); इंट आई, जे, लो पॉस, हाईपोस, धुएं; GenericList & LT; टी & gt; LeftList = new genericList & lt; T & gt; (); GenericList & LT; टी & gt; RightList = नया जेनेरिक सूची & lt; T & gt; (); GenericList & LT; टी & gt; TempList = नया जेनेरिक लिस्ट & lt; T & gt; (); अगर (यह.काउंट & gt; 1) {pivot = random.Next (1, this.Count); के लिए (i = 1; i & lt; = this.Qount; i ++) {यदि (मैं == धुएं) जारी रहता है; अगर (यह [आई]। कॉम्परेटर (इस [पिवोट]) & lt; 0 leftList.Add (यह [i]); और सही सूची। जोड़ें (यह [i]); } LeftList.QuickSort (); rightList.QuickSort (); के लिए (i = 1; i & lt; = leftList.Count; i ++) tempList.Add (बाएं लिस्ट [i]); tempList.Add (यह [धुरी]); के लिए (i = 1; i & lt; = rightList.Count; i ++) tempList.Add (सही सूची [i]); This.items = tempList.items; This.count = tempList.count; }}
आपका क्रियान्वयन आपके समनियों में धुरी भी शामिल है अपने सुब्बिलिस्ट्स में धुरी को शामिल करके (इस स्थिति में आपकी बाईं सूची क्योंकि आपकी स्थिति है & lt; =), यदि आप धुंधल के बीच में उस धुरी को समाप्त हो जाते हैं, तो आप एक संभव अनंत रिर्सशन के लिए खुद को स्थापित कर रहे हैं।
< P> उदाहरण:- सूची = [3, 6, 12 , 4, 8] पिवोट = 3 ( 12 ) बायां = [ 3, 6, 12 , 4, 8] सही = [खाली]
- सूची = [3, 6, 12 , 4, 8] धुरी = 3 ( 12 ) = [3, 6, 12 , 4, 8] सही = [खाली]
- सूची = [3, 6 , 12 , 4, 8] पिवट = 3 ( 12 ) बायां = [3, 6, 12 , 4, 8] सही = [ खाली]
- ... अनंत लूप
क्योंकि धुरी को शामिल नहीं किया गया है (हालांकि इसकी अंतिम स्थिति ज्ञात है), इसका परिणाम आपको एक ही सूची को छँटेगा और प्रत्येक पुनरावर्ती कॉल के साथ क्रमबद्ध करने के लिए सूचियों के आकार को कम करने के बजाय, हमेशा के लिए।
यदि आप अपने धुरी (सूचकांक द्वारा, मान द्वारा नहीं) को बाहर करते हैं और इसे बायें सूची और सही सूची के बीच अंतिम टेम्पललिस्ट में वापस जोड़ें, यह ठीक से काम करेगा।
... के लिए (i = 1; मैं & lt; = highPos; I ++) {यदि (मैं == धुएं) जारी रहता है; // यह जोड़ें यदि (यह [i] .कंपर्स (इस [पिवोट]) & lt; = 0) ... के लिए (i = 1; i & lt; = leftList.Count; i ++) tempList.Add (बायां लिस्ट [i] ); tempList.Add (यह [धुरी]); // इस के लिए जोड़ें (i = 1; i & lt; = rightList.Count; i ++) tempList.Add (सही सूची [i]); ...
भी देखें: (स्यूडोकोड के साथ)
Comments
Post a Comment