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
- TOP-K问题-堆排序和快排实现
- 快排、堆排和归并排序的Python实现
- 快排和堆排序
- 快排和堆排序
- 快排、堆排序
- 快排和堆排序对比
- 快排和堆排序分析
- java 快排和堆排序
- 大小堆排序 & Top K 问题
- 堆排序解决 top k 问题
- 各种排序的实现:希尔 归并 堆排 快排
- SDNU__1521.排序——堆排和快排
- 归并排序,堆排序,快排的简单实现
- 快排、归并排序、堆排序的实现
- 关于数组TOP K算法(快排及最小堆方式C代码)
- 关于数组TOP K算法(快排及最小堆方式C代码)
- 快速排序(快排)的一些细节和k-th问题
- 排序(快排,归并,堆排)
- 预处理指令
- JAVA获得图片的宽高
- CAS实现SSO单点登录原理
- 到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf
- APUE 1-8 strerror 和 perror
- TOP-K问题-堆排序和快排实现
- Java 常用API的运用,效率及技巧
- 怎样实现PDF与TXT文本之间的转换
- 安装MySql5.6
- 深入理解原型和闭包
- jQuery-searchableSelect(下拉搜索框)
- 例题9-3 UVA - 1347 Tour 旅行(DP)
- 基于Hadoop生态圈的数据仓库实践 —— ETL(二)
- git基础知识(一)