चलो तीसरे चर का उपयोग किए बिना दो नंबर स्वैप करने के लिए एक सरल सी उदाहरण देखें।
कार्यक्रम 1:
#include<stdio.h>
#include<conio.h>
main()
{
int a=10, b=20;
clrscr();
printf("Before swap a=%d b=%d",a,b);
a=a+b;//a=30 (10+20)
b=a-b;//b=10 (30-20)
a=a-b;//a=20 (30-10)
printf("\nAfter swap a=%d b=%d",a,b);
getch();
}
आउटपुट:
स्वैप करने से पहले a = 10 b = 20 स्वैप के बाद a = 20 b = 10
कार्यक्रम 2: * और / का उपयोग करना
चलो * और / का उपयोग करके दो नंबर स्वैप करने के लिए एक और उदाहरण देखें।
#include<stdio.h>
#include<conio.h>
main()
{
int a=10, b=20;
clrscr();
printf("Before swap a=%d b=%d",a,b);
a=a*b;//a=200 (10*20)
b=a/b;//b=10 (200/20)
a=a/b;//a=20 (200/10)
printf("\nAfter swap a=%d b=%d",a,b);
getch();
}
आउटपुट:
स्वैप करने से पहले a = 10 b = 20 स्वैप के बाद a = 20 b = 10
प्रोग्राम 3: बिटवाइज़ XOR ऑपरेटर का उपयोग करना:
बिटवाइज़ XOR ऑपरेटर का उपयोग दो चर को स्वैप करने के लिए किया जा सकता है। दो नंबर x और y का XOR एक संख्या देता है जिसमें सभी बिट्स 1 के रूप में होते हैं जहाँ भी x और y के बिट भिन्न होते हैं। उदाहरण के लिए, 10 का XOR (बाइनरी 1010 में) और 5 (बाइनरी 0101 में) 1111 और 7 (0111) का XOR और 5 (0101) (0010) है।
#include <stdio.h>
int main()
{
int x = 10, y = 5;
// Code to swap 'x' (1010) and 'y' (0101)
x = x ^ y; // x now becomes 15 (1111)
y = x ^ y; // y becomes 10 (1010)
x = x ^ y; // x becomes 5 (0101)
printf("After Swapping: x = %d, y = %d", x, y);
return 0;
आउटपुट:
स्वैप करने के बाद: x = 5, y = 10
कार्यक्रम 4:
किसी ने भी std :: swap का उपयोग करने का सुझाव नहीं दिया है, फिर भी।
std::swap(a, b);
मैं किसी भी अस्थायी चर का उपयोग नहीं करता हूं और ए और बी के प्रकार के आधार पर कार्यान्वयन में एक विशेषज्ञता हो सकती है जो या तो नहीं होती है। कार्यान्वयन को यह जानना चाहिए कि क्या एक 'चाल' उपयुक्त है या नहीं।
उपरोक्त तरीकों से समस्याएँ:
1) गुणन और विभाजन आधारित दृष्टिकोण काम नहीं करता है यदि संख्याओं में से एक 0 है, क्योंकि उत्पाद अन्य संख्या के बावजूद 0 हो जाता है।
2) दोनों अंकगणित समाधान अंकगणितीय अतिप्रवाह का कारण बन सकते हैं। यदि x और y बहुत बड़े हैं, तो जोड़ और गुणन पूर्णांक श्रेणी से बाहर हो सकते हैं।
3) जब हम एक चर के लिए संकेत का उपयोग करते हैं और एक फ़ंक्शन स्वैप करते हैं, तो उपरोक्त सभी विधियां विफल हो जाती हैं जब दोनों बिंदु एक ही चर को इंगित करते हैं। आइए एक नज़र डालते हैं कि इस मामले में क्या होगा यदि दोनों एक ही चर की ओर इशारा कर रहे हैं।
// बिटवाइज XOR आधारित विधि
x = x ^ x; // x becomes 0
x = x ^ x; // x remains 0
x = x ^ x; // x remains 0
// अंकगणित आधारित विधि
x = x + x; // x becomes 2x
x = x – x; // x becomes 0
x = x – x; // x remains 0
हमें निम्नलिखित कार्यक्रम देखें।
#include <stdio.h>
void swap(int *xp, int *yp)
{
*xp = *xp ^ *yp;
*yp = *xp ^ *yp;
*xp = *xp ^ *yp;
}
int main()
{
int x = 10;
swap(&x, &x);
printf("After swap(&x, &x): x = %d", x);
return 0;
}
आउटपुट :
स्वैप (& x, & x) के बाद: x = 0
कई मानक एल्गोरिदम में स्वयं के साथ एक चर की आवश्यकता हो सकती है। उदाहरण के लिए, QuickSort का यह कार्यान्वयन देखें जहां हम स्वयं के साथ एक चर स्वैप कर सकते हैं। स्वैपिंग से पहले एक शर्त लगाकर उपरोक्त समस्या से बचा जा सकता है।
#include <stdio.h>
void swap(int *xp, int *yp)
{
if (xp == yp) // Check if the two addresses are same
return;
*xp = *xp + *yp;
*yp = *xp - *yp;
*xp = *xp - *yp;
}
int main()
{
int x = 10;
swap(&x, &x);
printf("After swap(&x, &x): x = %d", x);
return 0;
}
आउटपुट :
स्वैप (& x, & x) के बाद: x = 10