int a[] = {12,13,12,13,19,18,15,12,15,16,17},要求对数组a进行排序,要求时间复杂度为O(N)
void BucketSort(int array[], int size)
{
assert(array && size > 0);
int max = array[0];
int min = array[0];
for(int i = 1; i < size; ++i)
{
max = array[i]>max?array[i]:max;
min = array[i]<min?array[i]:min;
}
int rang = max - min +1;
int *bucket = new int[rang];
memset(bucket, 0, sizeof(int)*4);
for(int i = 0; i < size; ++i)
{
bucket[ array[i]-min ] ++;
}
int index = 0;
for(int i = 0; i < rang; ++i)
{
for(int j = 0; j < bucket[i]; ++j)
{
array[index++] = min+i;
}
}
delete [] bucket;
}
求一个无序数组的中位数。
如:{2,5,4,9,3,6,8,7,1}的中位数为5,{2,5,4,9,3,6,8,7,1,0}的中位数为4和5。
要求:不能使用排序,时间复杂度尽可能低。
void Mid(int array[], int size)
{
assert(array && size > 0);
priority_queue<int> max_heap;
priority_queue<int, vector<int>, greater<int> > min_heap;
for(int i = 0; i < size; ++i)
{
if(i %2 == 1) //偶数进最小堆
{
min_heap.push(array[i]);
}
else
{
max_heap.push(array[i]);
}
if(!min_heap.empty() && !max_heap.empty() ) //保证最小堆中所有的元素都大于最大堆中的元素。
{
int temp = max_heap.top();
min_heap.push(temp);
max_heap.pop();
temp = min_heap.top();
max_heap.push(temp);
min_heap.pop();
}
}
if(size %2 == 0) //偶数
{
cout <<"偶数个元素时中位数是:"<< max_heap.top() << " "<< min_heap.top()<<endl;
}
else
{
cout <<"奇数个元素时中位数是:"<< max_heap.top()<<endl;
}
}