day21桶排序一个无序数组+求一个无序数组中的中位数

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()<else
    {
        cout <<"奇数个元素时中位数是:"<< max_heap.top()<

你可能感兴趣的:(每日一题)