class Solution
{
public:
int maxbit(vector<int>& nums) //求最大位数
{
int t=1; //t为最大位数
int p=10;
for(int i=0;i<nums.size();++i)
{
while(nums.at(i)>=p)
{
p*=10;
++t;
}
}
return t;
}
void RadixSort(vector<int>& nums)
{
int n=nums.size();
int t=maxbit(nums);
int* temp=new int[n]; //遍历一次位数时所需的辅助空间(不一定用完),存储排序后的元素
int* count=new int [10]; //若为十进制,则为计数空间
int radix=1; //从个位开始
for(int i=1;i<=t;++i) //从个位开始,遍历所有元素
{
for(int j=0;j<10;++j)
count[j]=0; //将所有位数的计数空间都记为0,类似于a[i]=0
for(int j=0;j<n;++j)
{
int k=(nums[j]/radix)%10; //从十位开始,由radix决定
count[k]++; //对应位数的元素开始计数
}
for(int j=1;j<10;++j) //因为有重复元素,因此需用这种方法保持稳定性
count[j]=count[j]+count[j-1];
for(int j=n-1;j>=0;--j)
{
int k=(nums[j]/radix)%10;
temp[count[k]-1]=nums[j];
count[k]--;
}
for(int j=0;j<n;++j)
nums[j]=temp[j];
radix*=10;
}
delete [] temp;
delete [] count;
}
int findKthLargest(vector<int>& nums, int k)
{
RadixSort(nums);
return nums.at(nums.size()-k);
}
};
基数排序
最新推荐文章于 2024-03-27 13:25:20 发布