मैंने तीन खूबसूरत क्विक्सॉर्ट्स को देखा और क्विकॉर्ट के साथ घूम रहा था। पायथन में मेरा कार्यान्वयन सी के समान था (पिवोट का चयन करें, इसके चारों ओर विभाजन और छोटे और बड़े विभाजनों पर पुनरावर्ती)। जो मैंने सोचा था पायथनिक नहीं था।पायथन क्विकॉर्ट - सूची समझ बनाम रिकर्सन (विभाजन दिनचर्या)
तो यह पाइथन में सूची समझ का उपयोग करके कार्यान्वयन है।
def qsort(list):
if list == []:
return []
pivot = list[0]
l = qsort([x for x in list[1:] if x < pivot])
u = qsort([x for x in list[1:] if x >= pivot])
return l + [pivot] + u
रिकर्सन मेथो qsortR को कॉल करने दें। अब मैंने देखा है कि qsortR बड़ी (आर) सूचियों के लिए qsort से बहुत धीमी गति से चलता है। असल में "अधिकतम रिकर्सन गहराई सीएमपी में पार हो गई" भर्ती विधि के लिए 1000 elems के लिए भी। जो मैं sys.setrecursionlimit में रीसेट करता हूं।
कुछ संख्या:
list-compr 1000 elems 0.491770029068
recursion 1000 elems 2.24620914459
list-compr 2000 elems 0.992327928543
recursion 2000 elems 7.72630095482
सभी कोड here है।
- क्यों इतना तेजी से सूची समझ है:
मैं सवालों की एक जोड़ी है?
- पायथन में रिकर्सन पर सीमा पर कुछ ज्ञान। मैंने इसे पहले 100000 तक सेट किया था कि मुझे किस मामले में सावधान रहना चाहिए?
- (वास्तव में क्या द्वारा 'पूंछ प्रत्यावर्तन के अनुकूलन' का मतलब है, यह कैसे किया जाता है?)
- सॉर्ट करने के लिए 1000000 तत्वों अपने लैपटॉप की स्मृति hogged (प्रत्यावर्तन विधि के साथ) की कोशिश कर रहा। अगर मैं इतने सारे तत्वों को सॉर्ट करना चाहता हूं तो मुझे क्या करना चाहिए? किस प्रकार के अनुकूलन संभव हैं?
hmmm। अच्छा विचार। मुझे इसे आज़माएं। – swair
आप सही हैं। यह तेजी से हो गया लेकिन सूची समझ विधि के रूप में तेज़ नहीं था। संख्या: 1000 elems सूची के लिए 1.2 और 2000 elems के लिए 3.41 – swair