इस समस्या में, हमें एक ऐरे दिया गया है और हमारा कार्य ऐरे को इस तरह बदलना है कि सभी सकारात्मक संख्याएं सम इंडेक्स स्थानों पर हों और सभी नकारात्मक संख्याएं विषम इंडेक्स स्थानों पर हों।
सकारात्मक और नकारात्मक मानों की संख्या असमान हो सकती है, इस मामले में हम अतिरिक्त मानों को नहीं हिलाएंगे।
समस्या को समझने के लिए एक उदाहरण लेते हैं,
इनपुट - {3, 5, -1, 19, -7, -2}
आउटपुट - {3, -1, 5, -7, 19, -2}
इस समस्या को हल करने के लिए, हमें ऐरे में उस तत्व को ढूंढना होगा जो क्रम से बाहर है। ऐसा करने के एक से अधिक तरीके हो सकते हैं, यहां हम उनमें से दो पर चर्चा करेंगे।
विधि 1
यह विधि बस ऐरे को ट्रैवर्स करेगी और उन तत्वों की पहली घटना ढूंढेगी जो जगह पर नहीं हैं (यानी सकारात्मक सम पर नहीं और नकारात्मक विषम पर नहीं) और फिर उन्हें स्वैप करेगी। हम इस प्रक्रिया को तब तक करेंगे जब तक पूरा ऐरे ट्रैवर्स न हो जाए।
उदाहरण
हमारे समाधान के कार्यान्वयन को दर्शाने वाला प्रोग्राम,
#include <iostream>
using namespace std;
void swapElements(int* a, int i, int j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
return;
}
void printArray(int* a, int n) {
for (int i = 0; i < n; i++)
cout << a[i] << "\t";
cout << endl;
return;
}
void generateOrderedArray(int arr[], int n) {
for (int i = 0; i < n; i++) {
if (arr[i] >= 0 && i % 2 == 1) {
for (int j = i + 1; j < n; j++) {
if (arr[j] < 0 && j % 2 == 0) {
swapElements(arr, i, j);
break;
}
}
} else if (arr[i] < 0 && i % 2 == 0) {
for (int j = i + 1; j < n; j++) {
if (arr[j] >= 0 && j % 2 == 1) {
swapElements(arr, i, j);
break;
}
}
}
}
printArray(arr, n);
}
int main() {
int arr[] = {1, -3, 5, 6, -3, 6, 7, -4, 9, 10};
int n = sizeof(arr) / sizeof(arr[0]);
cout << "प्रारंभिक ऐरे है: ";
printArray(arr, n);
cout << "सकारात्मक संख्याएं सम इंडेक्स पर और नकारात्मक संख्याएं विषम इंडेक्स पर: ";
generateOrderedArray(arr, n);
return 0;
}
आउटपुट
प्रारंभिक ऐरे है: 3 5 -1 19 -7 -2 सकारात्मक संख्याएं सम इंडेक्स पर और नकारात्मक संख्याएं विषम इंडेक्स पर: 3 -1 5 -7 19 -2
विधि 2
इस विधि में, हम एक ऐसी प्रक्रिया का उपयोग करेंगे जो क्विक सॉर्ट तकनीक जैसी दिखती है। यहां, हम दो पॉइंटर्स लेंगे, एक सकारात्मक के लिए और दूसरा नकारात्मक संख्याओं के लिए। हम सकारात्मक पॉइंटर को इंडेक्स 0 (सम इंडेक्स) पर और नकारात्मक को इंडेक्स 1 (विषम इंडेक्स) पर सेट करेंगे। और पॉइंटर को 2 से आगे बढ़ाएंगे। और तब रुकेंगे जब सकारात्मक पॉइंटर नकारात्मक संख्याओं का सामना करेगा और नकारात्मक पॉइंटर सकारात्मक संख्याओं का सामना करेगा। और फिर दोनों रुकने पर स्वैप करेंगे। यदि कोई पॉइंटर ऐरे इंडेक्स से बाहर जाता है तो हम निष्पादन रोक देंगे।
उदाहरण
हमारे समाधान के कार्यान्वयन को दर्शाने वाला प्रोग्राम
#include <iostream>
using namespace std;
void swapElements(int* a, int i, int j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
return;
}
void printArray(int* a, int n) {
for (int i = 0; i < n; i++)
cout << a[i] << "\t";
cout << endl;
}
void generateOrderedArray(int a[], int size) {
int positive = 0, negative = 1;
while (1) {
while (positive < size && a[positive] >= 0)
positive += 2;
while (negative < size && a[negative] <= 0)
negative += 2;
if (positive < size && negative < size)
swapElements(a, positive, negative);
else
break;
}
}
int main() {
int arr[] = {3, 5, -1, 19, -7, -2};
int n = (sizeof(arr) / sizeof(arr[0]));
cout << "प्रारंभिक ऐरे है: ";
printArray(arr, n);
cout << "सकारात्मक संख्याएं सम इंडेक्स पर और नकारात्मक संख्याएं विषम इंडेक्स पर: ";
generateOrderedArray(arr, n);
printArray(arr, n);
return 0;
}
आउटपुट
प्रारंभिक ऐरे है: 3 5 -1 19 -7 -2 सकारात्मक संख्याएं सम इंडेक्स पर और नकारात्मक संख्याएं विषम इंडेक्स पर: 3 -1 5 -7 19 -2