题目:
unsigned int 型一个数组,按照比特位中“1”的个数对数组元素进行从小到大排序,如果含有“1”的个数相同,按从小到大排序,unsigned int 32位。
函数原型: int sort(unsigned int *a, int len);
代码:
// Test1.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "stdio.h" #include "iostream" using namespace std; struct DATA { unsigned int num; unsigned int count; // 记录unsigned int 变量中比特位为1的个数 }; int sort(unsigned int *arr, int length); int _tmain(int argc, _TCHAR* argv[]) { unsigned int num[5]={2,10,4,15,5}; sort(num,5); system("pause"); return 0; } // 对数组中的元素通过每个元素的比特位中1的个数进行排序,包含个数相同的采用元素大小进行排序 int sort(unsigned int *arr, int length) { DATA *p=new DATA[length]; if (p==NULL) { return 0; } for (int i=0;i<length;i++) { p[i].num=arr[i]; p[i].count=0; // 初始化 } // 统计比特位1的个数 int BIT_SIZE=sizeof(unsigned int)*8; unsigned int FLAG_CP=0x0001; // 用于进行按位与 unsigned int FLAG_YES=0x0001; unsigned int FLAG_NO=0x0000; for(int i=0;i<length;i++) { // 每个数进行统计 unsigned int temp=p[i].num; for(int j=0;j<BIT_SIZE;j++) { unsigned result=temp&FLAG_CP; if (result==FLAG_YES) { p[i].count++; } temp=temp>>1; } } // 根据比特位1进行排序 for (int i=0;i<length-1;i++) { for (int j=i+1;j<length;j++) { if (p[j].count<p[i].count) { DATA temp=p[j]; p[j]=p[i]; p[i]=temp; } else { if (p[j].count==p[i].count) { // 比特位1相同,按照元素值大小进行排序 if (p[j].num<p[i].num) { DATA temp=p[j]; p[j]=p[i]; p[i]=temp; } } } } } // 输出排序结果 for(int i=0;i<length;i++) { printf("%5d",p[i].num); } printf("\n"); return 1; }