TOP-K问题-堆排序和快排实现

1,堆排序:转自:http://www.cnblogs.com/codingmylife/archive/2012/09/04/2671078.html

#include <iostream>
#include <algorithm>
 
using namespace std;
 
template<typename T>
void unguarded_heapify(T *data, size_t size, size_t top)
{
    while (true)
    {
        size_t min = top;
 
        if (top * 2 < size && data[top * 2] < data[min])
        {
            min = top * 2;
        }
 
        if (top * 2 + 1 < size && data[top * 2 + 1] < data[min])
        {
            min = top * 2 + 1;
        }
 
        if (top == min) return;
 
        swap(data[top], data[min]);
        top = min;
    }
}
 
template<typename T>
void make_min_heap(T *begin, T *end)
{
    if (begin == NULL || end == NULL)
    {
        return;
    }
 
    if (begin == end || begin + 1 == end)
    {
        return;
    }
 
    size_t len = end - begin;
 
    for (size_t top = len / 2; top >= 1; --top)
    {
        // Special offset.
        unguarded_heapify(begin - 1, len + 1, top);
    }
}
 
void topk(const int *begin, const int *end, int *buffer, size_t *k)
{
    if (begin == NULL || end == NULL || buffer == NULL || k == NULL)
    {
        return;
    }
 
    if (begin == end || *k == 0)
    {
        return;
    }
 
    memset(buffer, 0, *k * sizeof(int));
 
    const int *p = begin;
    int *dest = buffer;
 
    while (p != begin + *k && p != end)
    {
        *dest++ = *p++;
    }
 
    if (p == end)
    {
        *k = end - begin;
    }
    else
    {
        make_min_heap(buffer, dest);
 
        while (p != end)
        {
            if (*p > *buffer)
            {
                *buffer = *p;
                unguarded_heapify(buffer - 1, *k + 1, 1);
            }
 
            ++p;
        }
    }
}
 
int main(int argc, char **argv)
{
    int data[] = {4, 5, 1, 3, 5, 6, 7, 2};
    int *result = new int[10];
 
    size_t k = 3;
    topk(data, data + sizeof(data) / sizeof(data[0]), result, &k);
    copy(result, result + k, ostream_iterator<int>(cout, " "));
    cout << endl;
 
    k = 10;
    topk(data, data + sizeof(data) / sizeof(data[0]), result, &k);
    copy(result, result + k, ostream_iterator<int>(cout, " "));
    cout << endl;
 
    k = 1;
    topk(data, data + sizeof(data) / sizeof(data[0]), result, &k);
    copy(result, result + k, ostream_iterator<int>(cout, " "));
    cout << endl;
 
    k = 8;
    topk(data, data + sizeof(data) / sizeof(data[0]), result, &k);
    copy(result, result + k, ostream_iterator<int>(cout, " "));
    cout << endl;
 
    k = 0;
    topk(data, data + sizeof(data) / sizeof(data[0]), result, &k);
    copy(result, result + k, ostream_iterator<int>(cout, " "));
    cout << endl;
 
    delete[] result;
    return 0;
}

2.快排:转自:http://blog.csdn.net/fanzitao/article/details/7617223

public class TopK_Quick {  
  
    public static int Partition(int a[],int low,int high)  
    {  
        a[0]=a[low];  
        int pivokey = a[low];  
        while(low<high)  
        {  
            while(low<high && a[high]>=pivokey) --high;  
            a[low] = a[high];  
            while(low<high && a[low]<=pivokey) ++low;  
            a[high]= a[low];  
        }  
        a[low]=a[0];  
        return low;  
    }  
      
    public static void display(int a[],int k)  
    {  
        for(int i=1;i<=k;i++)  
        {  
            System.out.print(a[i]+" ");  
        }  
    }  
    public static int selectK(int a[],int start,int end,int k)  
    {  
        int index = 0;  
        if(start<end)  
        {  
            index = Partition(a,start,end);  
            if(index == k)//正好找到第k大的数  
            {  
                index = k;  
            }else if(index < k)//还要从index的右边找k-index个数  
            {  
                index = selectK(a,index+1,end,k-index);  
            }else if(index > k)//k个数都在Index的左边  
            {  
                index = selectK(a,start,index-1,k);  
            }  
        }  
        return index;  
  
    }  
    public static void main(String args[])  
    {  
        int k=0;  
        int a[]={0,49,38,29,65,97,76,13,27,49,22,19};  
        if(k>0&&k<=a.length-1)  
        {  
            selectK(a,1,a.length-1,k);  
            display(a,k);  
        }else{  
            System.out.println("Are You Kidding Me?");  
        }  
          
    }  
}  

点赞