এই সেকশনে আমরা আরেকটি সর্টিং সমস্যা দেখব। মনে করুন у нас দুটি অ্যারে 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):
শুরু
যদি num1 এবং num2 দুটোই A2-তে উপস্থিত থাকে, তবে
num1-এর ইনডেক্স - num2-এর ইনডেক্স রিটার্ন করো
অন্যথায় যদি num1 A2-তে না থাকে, তবে
-1 রিটার্ন করো
অন্যথায় যদি num2 A1-তে না থাকে, তবে
1 রিটার্ন করো
অন্যথায়
num1 - num2
শেষ
উদাহরণ (C++ কোড)
#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