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

来源:互联网 发布:java实现国际化 编辑:程序博客网 时间:2024/06/06 03:14

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;    }}
原创粉丝点击