设为首页 加入收藏

TOP

数据结构:堆(三)
2012-12-10 13:09:11 来源: 作者: 【 】 浏览:1815
Tags:数据结构

 

  //堆排序

  template <class T>

  void Sort::HeapSort(T arr[], int len){

  int i;

  //建立子堆

  for(i = len / 2; i >= 1; i--){

  CreateHeap(arr, i, len);

  }

  for(i = len - 1; i >= 1; i--){

  buff = arr ;

  arr = arr[i + 1];

  arr[i + 1] = buff;

  CreateHeap(arr, 1, i);

  }

  }

  //建立堆

  template <class T>

  void Sort::CreateHeap(T arr[], int root, int len){

  int j = 2 * root;      //root's left child, right (2 * root + 1)

  T temp = arr[root];

  bool flags = false;

  while(j <= len && !flags){

  if(j < len){

  if(arr[j] < arr[j + 1]){  // Left child is less then right child

  ++j;     // Move the index to the right child

  }

  }

  if(temp < arr[j]){

  arr[j / 2] = arr[j];

  j *= 2;

  }else{

  flags = true;

  }

  }

  arr[j / 2]  = temp;

  } 2.选择前k个最大(最小)的数

  思想:在一个很大的无序数组里面选择前k个最大(最小)的数据,最直观的做法是把数组里面的数据全部排好序,然后输出前面最大(最小)的k个数据。但是,排序最好需要O(nlogn)的时间,而且我们不需要前k个最大(最小)的元素是有序的。这个时候我们可以建立k个元素的最小堆(得出前k个最大值)或者最大堆(得到前k个最小值),我们只需要遍历一遍数组,在把元素插入到堆中去只需要logk的时间,这个速度是很乐观的。利用堆得出前k个最大(最小)元素特别适合海量数据的处理。

  代码:

  [cpp]

  typedef multiset<int, greater<int> >            intSet;

  typedef multiset<int, greater<int> >::iterator  setIterator;

  void GetLeastNumbers(const vector<int>& data, intSet& leastNumbers, int k)

  {

  leastNumbers.clear();

  if(k < 1 || data.size() < k)

  return;

  vector<int>::const_iterator iter = data.begin();

  for(; iter != data.end(); ++ iter)

  {

  if((leastNumbers.size()) < k)

  leastNumbers.insert(*iter);

  else

  {

  setIterator iterGreatest = leastNumbers.begin();

  if(*iter < *(leastNumbers.begin()))

  {

  leastNumbers.erase(iterGreatest);

  leastNumbers.insert(*iter);

  }

  }

  }

        

首页 上一页 1 2 3 4 5 6 7 下一页 尾页 3/8/8
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇数据结构_单调队列 下一篇C++将字符串转换成数字

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: