Swap Without Third Variable
बिना third variable swap क्यों?
दो numbers को swap करना यानी उनकी values आपस में बदलना: अगर a 5 है और b 9, तो swap के बाद a 9 और b 5 हो जाता है। सीधा तरीका एक temporary variable इस्तेमाल करता है। लेकिन C का एक बहुत आम interview सवाल है — यही काम बिना किसी third (temporary) variable के करना।
ऐसा इसलिए नहीं कि यह तेज़ है — आमतौर पर नहीं होता। यह इसलिए पूछा जाता है ताकि पता चले कि आप arithmetic और bitwise operators को कितना समझते हैं। इस page पर आप चार अलग तरीके सीखेंगे, हर एक का सही output देखेंगे, और यह भी जानेंगे कि हर तरीका कहाँ चुपचाप टूट जाता है।
साफ़ swap temp variable से होता है: int t = a; a = b; b = t;। असली projects में यही सही विकल्प है। नीचे दिए tricks interview और समझने के लिए हैं।
तरीका 1: जोड़ और घटाव
विचार यह है कि दोनों का कुल जोड़ a में रखें, फिर घटाकर हर original value वापस निकालें।
#include <stdio.h>
int main() {
int a = 5, b = 9;
a = a + b; // a = 14 (कुल जोड़)
b = a - b; // b = 14 - 9 = 5 (original a)
a = a - b; // a = 14 - 5 = 9 (original b)
printf("Swap ke baad: a = %d, b = %d\n", a, b);
return 0;
}Swap ke baad: a = 9, b = 5
अगर a और b दोनों बड़े हों, तो a + b किसी int की range (लगभग 2.1 अरब) से बाहर जाकर overflow कर सकता है और गलत result देता है। यह तरीका सिर्फ़ छोटी values के लिए सुरक्षित है।
तरीका 2: गुणा और भाग
वही विचार, पर जोड़-घटाव की जगह गुणा-भाग से।
#include <stdio.h>
int main() {
int a = 5, b = 9;
a = a * b; // a = 45
b = a / b; // b = 45 / 9 = 5
a = a / b; // a = 45 / 5 = 9
printf("Swap ke baad: a = %d, b = %d\n", a, b);
return 0;
}Swap ke baad: a = 9, b = 5
अगर कोई value 0 हो तो यह तरीका पूरी तरह fail हो जाता है (zero से भाग)। जो numbers पूरे-पूरे भाग नहीं होते उनमें accuracy भी खोती है। इसे सिर्फ़ जानकारी के लिए समझें।
तरीका 3: XOR (bitwise) swap
XOR operator (^) की खासियत: कोई value खुद से XOR होकर 0 बन जाती है, और XOR उलटा किया जा सकता है। इससे बिना overflow के swap हो जाता है।
#include <stdio.h>
int main() {
int a = 5, b = 9;
a = a ^ b; // a और b के bits जोड़ें
b = a ^ b; // original a को b में लाएँ
a = a ^ b; // original b को a में लाएँ
printf("Swap ke baad: a = %d, b = %d\n", a, b);
return 0;
}Swap ke baad: a = 9, b = 5
XOR bit-by-bit काम करता है और carry नहीं करता, इसलिए overflow नहीं होता — यही arithmetic तरीके पर इसकी असली बढ़त है।
अगर दोनों variable एक ही memory location हों (जैसे swap(&x, &x)), तो XOR swap उस variable को 0 कर देता है, क्योंकि x ^ x 0 होता है। XOR-swap से पहले हमेशा जाँचें कि दोनों addresses अलग हैं।
तरीका 4: One-line trick
जोड़ वाले तरीके को एक ही line में दबाया जा सकता है। दिखने में चालाक, पर पढ़ने में मुश्किल:
#include <stdio.h>
int main() {
int a = 5, b = 9;
a = a + b - (b = a); // one-line swap
printf("Swap ke baad: a = %d, b = %d\n", a, b);
return 0;
}Swap ke baad: a = 9, b = 5
ऐसे one-liner evaluation order पर निर्भर करते हैं और आसानी से गलत हो जाते हैं। Interview में दिख सकते हैं, पर असली code में न लिखें — साफ़ाई चालाकी से बेहतर है।
कौन सा तरीका चुनें?
| तरीका | Overflow safe? | 0 के साथ चलता है? | पढ़ने में? |
|---|---|---|---|
| Temp variable (सामान्य) | हाँ | हाँ | सबसे अच्छा |
| जोड़ / घटाव | नहीं | हाँ | ठीक |
| गुणा / भाग | नहीं | नहीं | ठीक |
| XOR | हाँ | हाँ* | पेचीदा |
*XOR 0 values के साथ सुरक्षित है, पर तब नहीं जब दोनों variable एक ही location हों।
आम गलतियाँ
- यह भूलना कि बड़ी संख्याओं में जोड़ overflow कर सकता है और चुपचाप गलत result देता है।
- जब value 0 हो सकती हो तब गुणा-भाग तरीका इस्तेमाल करना।
- एक ही variable पर XOR swap लगाकर उसे गलती से 0 कर देना।
- सिर्फ़ चालाक दिखने के लिए production code में unreadable one-liner लिखना।
XOR से एक swap function void swap(int *x, int *y) लिखें और उसमें जाँच जोड़ें जो x == y होने पर swap छोड़ दे। फिर swap(&n, &n) से test करें कि अब value 0 नहीं होती।
सारांश
- बिना third variable swap एक interview/सीखने का अभ्यास है, performance trick नहीं।
- जोड़-घटाव सरल है पर overflow कर सकता है।
- गुणा-भाग 0 और अपूर्ण भाग पर टूट जाता है।
- XOR swap overflow से बचता है पर दोनों operand एक ही address होने पर fail होता है।
- असली code में सामान्य temp-variable swap सबसे साफ़ और उतना ही तेज़ है।
अक्सर पूछे जाने वाले प्रश्न (FAQ)
क्या C में बिना third variable swap करना सच में बेहतर है?
जोड़-घटाव वाला तरीका कब fail हो सकता है?
a + b किसी int की range से बड़ा हो सकता है और integer overflow हो जाता है। दोनों numbers बड़े हों तो sum wrap हो जाता है और गलत result मिलता है। बड़ी values के लिए temp variable या XOR तरीका बेहतर है।अगर किसी variable को खुद से XOR-swap करें तो क्या होगा?
swap(&x, &x)), तो XOR swap उस variable को 0 कर देता है, क्योंकि x ^ x हमेशा 0 होता है। यही XOR swap का छिपा हुआ bug है, इसलिए equal addresses की जाँच ज़रूरी है।