基数排序:就是先排个位数,然后十位数,然后百位数
代码:
int maxbit(int a[],int sz)
{
int d=1;
int p=10;
for(int i=0;i<sz;i++)
{
while(a[i]>=p)
{
p*=10;
d++;
}
}
return d;
}
void radixsort(int a[],int sz)
{
int dist=maxbit(a,sz);
int temp[sz];
int count[11];
int radix=1;
for(int i=1;i<=dist;i++)
{
memset(count,0,sizeof(count));
for(int j=0;j<sz;j++)//统计每个桶的记录数
{
int k=(a[j]/radix)%10;
count[k]++;
}
for(int j=1;j<10;j++)//为后面下标服务
{
count[j]=count[j-1]+count[j];
}
for(int j=sz-1;j>=0;j--)
{
int k=(a[j]/radix)%10;
temp[count[k]-1]=a[j];
count[k]--;
}
for(int j=0;j<sz;j++)
{
a[j]=temp[j];
}
radix*=10;
}
}
Given an unsorted array, find the maximum difference between the successive elements in its sorted form.
Try to solve it in linear time/space.
Return 0 if the array contains less than 2 elements.
You may assume all elements in the array are non-negative integers and fit in the 32-bit signed integer range.
Credits:
Special thanks to @porker2008 for adding this problem and creating all test cases.
Subscribe to see which companies asked this question
#include<iostream>
using namespace std;
#include<vector>
#include<string.h>
class Solution
{
public:
int maximumGap(vector<int>& nums)
{
int n = nums.size();
if(n < 2)return 0;
radixSort(nums);
int maxGap = -1;
for(int i = 1; i < n; i++)
{
maxGap = max(maxGap, nums[i] - nums[i-1]);
}
return maxGap;
}
public:
int maxbit(vector<int>& a)
{
int d=1;
int p=10;
for(int i=0; i<a.size(); i++)
{
while(a[i]>=p)
{
p*=10;
d++;
}
}
return d;
}
void radixSort(vector<int>& a)
{
int dist=maxbit(a);
int temp[a.size()];
int count[11];
int radix=1;
for(int i=1; i<=dist; i++)
{
memset(count,0,sizeof(count));
for(int j=0; j<a.size(); j++) //统计每个桶的记录数
{
int k=(a[j]/radix)%10;
count[k]++;
}
for(int j=1; j<10; j++) //为后面下标服务
{
count[j]=count[j-1]+count[j];
}
for(int j=a.size()-1; j>=0; j--)
{
int k=(a[j]/radix)%10;
temp[count[k]-1]=a[j];
count[k]--;
}
for(int j=0; j<a.size(); j++)
{
a[j]=temp[j];
}
radix*=10;
}
}
};