এই বিভাগে আমরা আরেকটি বাছাই সমস্যা দেখতে পাব। ধরুন আমাদের দুটি অ্যারে 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 তে নিম্ন সূচক সহ সংখ্যাটিকে অন্য সংখ্যার চেয়ে ছোট হিসাবে গণ্য করা হবে
- যদি A2 তে num1 বা num2 থাকে, তাহলে সেই সংখ্যাটিকে অন্যটির থেকে ছোট হিসাবে গণ্য করা হবে, যেটি 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