इस सेक्शन में हम एक और सॉर्टिंग समस्या देखेंगे। मान लीजिए हमारे पास दो ऐरे A1 और A2 हैं। हमें A1 को इस तरह सॉर्ट करना है कि एलिमेंट्स के बीच का सापेक्ष क्रम वैसा ही हो जैसा वे A2 में हैं। यदि कुछ एलिमेंट्स A2 में मौजूद नहीं हैं, तो वे सॉर्टेड एलिमेंट्स के बाद जोड़ दिए जाएंगे। मान लीजिए A1 और A2 निम्नलिखित हैं -
A1 = {2, 1, 2, 1, 7, 5, 9, 3, 8, 6, 8} A2 = {2, 1, 8, 3}सॉर्टिंग के बाद A1 इस तरह होगा -
A1 = {2, 2, 1, 1, 8, 8, 3, 5, 6, 7, 9}इस समस्या को हल करने के लिए, हम अपना कस्टम कम्पेयर मेथड बनाएंगे। वह मेथड तुलना करेगा और एलिमेंट्स को ऐरे में रखेगा। तुलना लॉजिक नीचे जैसा होगा -
- यदि num1 और num2 दोनों A2 में हैं, तो A2 में लोअर इंडेक्स वाला नंबर दूसरे नंबर से छोटा माना जाएगा
- यदि num1 या num2 में से कोई एक A2 में मौजूद है, तो वह नंबर दूसरे से छोटा माना जाएगा, जो A2 में मौजूद नहीं है।
- यदि दोनों A2 में मौजूद नहीं हैं, तो नेचुरल ऑर्डरिंग उपयोग की जाएगी।
एल्गोरिदम
compare(num1, num2): Begin यदि num1 और num2 दोनों A2 में मौजूद हैं, तो return num1 का इंडेक्स – num2 का इंडेक्स else यदि num1 A2 में नहीं है, तो return -1 else यदि num2 A1 में नहीं है, तो return 1 else num1 – num2 End
उदाहरण
#include<iostream> #include<algorithm> using namespace std; int size = 5; int A2[5]; //ग्लोबल A2 कम्पेयर फंक्शन में उपयोग होगा int search_index(int key){ int index = 0; for(int i = 0; i < size; i++){ if(A2[i] == key) return i; } return -1; } int compare(const void *num1, const void *num2){ int index1 = search_index(*(int*)num1); int index2 = search_index(*(int*)num2); if (index1 != -1 && index2 != -1) return index1 - index2; else if (index1 != -1) return -1; else if (index2 != -1) return 1; else return (*(int*)num1 - *(int*)num2); } main(){ int data[] = {2, 1, 2, 1, 7, 5, 9, 3, 8, 6, 8}; int n = sizeof(data)/sizeof(data[0]); int a2[] = {2, 1, 8, 3}; int n2 = sizeof(a2)/sizeof(a2[0]); for(int i = 0; i<n2; i++){ A2[i] = a2[i]; } qsort(data, n, sizeof(int), compare); for(int i = 0; i<n; i++){ cout << data[i] << " "; } }आउटपुट
2 2 1 1 8 8 3 5 6 7 9