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

来源:互联网 发布:淘宝介入对店铺影响 编辑:程序博客网 时间:2024/05/19 08:03
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?");          }                }  }  



0 0
原创粉丝点击