यहां हम सेट-बिट्स के आधार पर ऐरे को सॉर्ट करने की एक दिलचस्प समस्या देखेंगे। जब ऐरे में किसी एलिमेंट में अधिक सेट-बिट्स होते हैं, तो उसे उस एलिमेंट से पहले रखा जाएगा जिसमें कम सेट बिट्स होते हैं। मान लीजिए कुछ नंबर्स हैं 12, 15, 7। तो सेट बिट्स मूल रूप से उनके बाइनरी प्रतिनिधित्व में 1's की संख्या है। ये हैं 1100 (12), 1111 (15), और 0111 (7)। तो सॉर्ट करने के बाद यह इस तरह दिखेगा -
1111, 0111, 1100 (15, 7, 12)
यहां हमें सबसे पहले सेट-बिट्स की संख्या पता करनी होगी। फिर हम उन्हें सॉर्ट करने के लिए C++ STL सॉर्ट फंक्शन का उपयोग करेंगे। हमें सेट-बिट काउंट्स के आधार पर तुलना लॉजिक बनाना होगा।
एल्गोरिदम
getSetBitCount(number): Begin count := 0 जब तक number 0 नहीं है, करें यदि number AND 1 = 1, तो count को 1 से बढ़ाएं number = number को एक बिट राइट शिफ्ट करें done return count End compare(num1, num2): Begin count1 = getSetBitCount(num1) count2 = getSetBitCount(num2) यदि count1 <= count2, तो false रिटर्न करें, अन्यथा true रिटर्न करें End
उदाहरण
#include<iostream> #include<algorithm> using namespace std; int getSetBitCount(int number){ int count = 0; while(number){ if(number & 1 == 1) count++; number = number >> 1 ; //नंबर को एक बिट राइट शिफ्ट करें } return count; } int compare(int num1, int num2){ int count1 = getSetBitCount(num1); int count2 = getSetBitCount(num2); if(count1 <= count2) return 0; return 1; } main(){ int data[] = {2, 9, 4, 3, 5, 7, 15, 6, 8}; int n = sizeof(data)/sizeof(data[0]); sort(data, data + n, compare); for(int i = 0; i<n; i++){ cout << data[i] << " "; } }आउटपुट
15 7 9 3 5 6 2 4 8