寻找第K大的数
来源:互联网 发布:mac导入照片进iphone 编辑:程序博客网 时间:2024/05/01 11:00
#include <stdio.h>#include <stdlib.h>int Left(int parent) { return parent * 2 + 1;}int Right(int parent) { return (parent + 1) * 2;}int Parent(int child) { return (child - 1) / 2;}template<typename T>void Swap(T& left, T& right) { T tmp = left; left = right; right = tmp;}template<typename T>void MinHeapfy(T array[], int parent, int length) { int min = parent; if (Left(parent) < length && array[Left(parent)] < array[parent]) { min = Left(parent); } if (Right(parent) < length && array[Right(parent)] < array[min]) { min = Right(parent); } if (min != parent) { Swap(array[parent], array[min]); MinHeapfy(array, min, length); }}template<typename T>bool HeapFinding(T array[], const T& target, int parent, int length) { bool left_match = Left(parent) < length && target == array[Left(parent)]; bool right_match = Right(parent) < length && target == array[Right(parent)]; if (left_match || right_match) { return true; } bool left_finded, right_finded; if (Left(parent) < length && array[Left(parent)] < target) { left_finded = HeapFinding(array, target, Left(parent), length); } else { left_finded = false; } if (Right(parent) < length && array[Right(parent)] < target) { right_finded = HeapFinding(array, target, Right(parent), length); } else { right_finded = false; } if (left_finded || right_finded) { return true; } else { return false; }}template<typename T>T FindMaxK(T array[], int start, int end, int K) { if (K > 0) { int middle = (start + end) / 2; T average = (array[start] + array[middle] + array[end]) / 3; // printf("%d\n", average); int j = start - 1; for (int i = start; i <= end; ++i) { if (array[i] <= average) { Swap(array[i], array[j + 1]); j++; } } int length = end - (j + 1) + 1; if (length > K) { return FindMaxK(array, j + 1, end, K); } else if(length == K) { return array[j + 1]; } else { return FindMaxK(array, start, j, K - length); } } } int main(int argc, char** argv) { const int kDataSize = 100; int array[kDataSize]; for (int i = 0; i < kDataSize; ++i) { array[i] = rand() % 10; printf("%d\n", array[i]); } const int heap_size = 3; int heap[heap_size] = {0x80000001, 0x80000001,0x80000001}; for (int i = 0; i < kDataSize; ++i) { if (array[i] > heap[0]) { if (!HeapFinding(heap, array[i], 0, heap_size)) { heap[0] = array[i]; MinHeapfy(heap, 0, heap_size); } } /* for (int i = 0; i < heap_size; ++i) { printf("%d ", heap[i]); } printf("\n"); */ } for (int i = 0; i < heap_size; ++i) { printf("%d ", heap[i]); } printf("\n"); printf("max Kth = %d\n", FindMaxK(array, 0, kDataSize -1, 1));}
参考文献:
编程之美2.5
http://www.cnblogs.com/jillzhang/archive/2007/10/04/913478.html
- 寻找第K大的数
- 寻找第K大的数
- 寻找第K大的数
- 寻找第K大的数
- 寻找第K大的数
- 寻找第K大的数
- 寻找第K大的数
- 寻找第K大的数
- 寻找第k大的数
- 寻找第k大的数
- 寻找第K大的数的方法总结
- 寻找第K大的数的方法总结
- 寻找第K大的数的方法总结
- 寻找第K大的数的方法总结
- 寻找第K大的数的方法总结
- 寻找第K大的数的方法总结
- 寻找第K大的数的方法总结
- 寻找第K大的数的方法总结
- Pocket PC Windows目录下程序含义
- 图的深度优先搜索(邻接矩阵)
- Pocket PC获取路径的六种方法
- 网络互联参考模型(详解)
- 给linux设置ip地址
- 寻找第K大的数
- 程序员技术练级攻略
- Android SeekBar的使用
- 自学篇-循环语句应用(二)
- 面试总结(7)
- XML操作类(包括读取/插入/修改/删除)
- 自问:是什么让我孜孜不倦地写代码?
- Java多线程阻塞队列和并发集合
- jQuery中extend中方法互相调用