इस खंड में हम एक और छँटाई समस्या देखेंगे। मान लीजिए कि हमारे पास दो सरणियाँ हैं 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 if both num1 and num2 are present in A2, then return index of num1 – index of num2 else if num1 is not in A2, then return -1 else if num2 is not in A1, then return 1 else num1 – num2 End. लौटाएं
उदाहरण
#include<iostream> #include<algorithm> using namespace std; int size = 5; int A2[5]; //global A2 will be used in compare function 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