के लिए आरोही क्रम में एक ढेर सॉर्टिंग करने के लिए सबसे अच्छी विधि क्या है? I इस साक्षात्कार के प्रश्न में आया, और मैं सबसे अच्छे और सबसे कुशल समाधान के लिए कुछ समस्याओं में भाग रहा था।चढ़ते क्रम में एक ढेर छंटनी?
दो विधियां हैं जिन्हें मैं सोच सकता हूं।
ढेर की सभी सामग्री पॉप करने के लिए और उन्हें एक सरणी में स्टोर, और फिर
O(nLog n)
में सरणी सॉर्ट और फिर धक्का सामग्री ढेर वापस। नहीं सबसे अच्छा तरीका है ....छँटाई यह
void sort(stack)
{
type x;
if (!isEmpty(stack)) {
x = pop(stack);
sort(stack);
insert(x, stack);
}
}
void insert(x, stack)
{
type y;
if (!isEmpty(stack) && top(stack) < x) {
y = pop(stack);
insert(x, stack);
push(y, stack);
}
else {
push(x, stack);
}
}
लेकिन 2 विधि भी कई पुनरावर्ती कॉल और भूमि के ऊपर बनाने जा रहा है के लिए ढेर के पुनरावर्ती कार्यान्वयन करें यदि स्टैक वास्तव में बड़ा होता है तो एक समस्या होगी।
क्या इस समस्या को सर्वोत्तम स्थान और समय की जटिलता के लिए बेहतर तरीके से हल करना संभव है?
इतने सारे रिकर्सिव कॉल हैं, (सबप्रोबैम्स ओवरलैपिंग), क्या यह dynamic programming
समस्याओं के प्रकार के लिए एक प्रतियोगी है?
इसे हल करने का सबसे अच्छा तरीका क्या होगा? ?
'ओ (एन * लॉग एन) 'सॉर्टिंग समय उप-स्थानिक क्यों है? सामान्य मामले के लिए, यह सिद्ध सीमा है। –
आप 'ओ (एन) 'स्पेस और' ओ (एन लॉग एन) 'समय से बेहतर नहीं कर सकते हैं। एक सरणी में छंटनी, छंटाई और धक्का इष्टतम है। – avakar
@avakar: पहले दावे के लिए सबूत मिला ("ओ (एन)' स्पेस से बेहतर नहीं कर सकता ")? – NPE