亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

堆基本操作實現最大堆

2020-01-26 15:35:41
字體:
來源:轉載
供稿:網友

復制代碼 代碼如下:

/**
* 實現最大堆
*
*/

#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <cstdio>

using namespace std;
const int M = 10003;

//定義數據節點
class dNode{
public:
 string name;
 int age;
 double score;
 dNode():name("no name"), age(0), score(0.0){}
 dNode(string name, int age, double score):name(name), age(age), score(score){}
 bool operator < (const dNode & d){
  return score < d.score;
 }
 bool operator > (const dNode &d){
  return score > d.score;
 }
 bool operator = (const dNode &d){
  name = d.name;age=d.age;score=d.score;
 }
 bool operator == (const dNode &d){
  return name == d.name && age == d.age && score == d.score;
 }
 void swap(dNode & a, dNode & b){
  dNode tmp = a;
  a = b;
  b = tmp;
 }
 void show(){
  cout << "***************" << endl;
  cout << "name: " << name << endl;
  cout << "age: " << age << endl;
  cout << "score: " << score << endl;
 }
};
//定義堆
template<class T>
class Heap{
public:
 dNode h[M];
 void heapify(int cur);
 int n;
 //數組下標從0開始
 int L(int i){return (i << 1) + 1;}
 int R(int i){return (i << 1) + 2;}
 int P(int i){return (i - 1) >> 1;}
public:
 Heap():n(0){}
 Heap(T data[], int len){
  memcpy(h, data, sizeof(T) * len);
  n = len;
 }
 //對數組h建立成堆
 void build();
 //插入一個元素
 void insert(T data);
 //彈出堆頂元素
 void pop(){
  h[0] = h[--n];
  heapify(0);
 };
 //堆頂元素
 T top(){return h[0];}
 //打印數組中的全部元素
 void show(){
  for(int i = 0; i < n; i++){
   cout << "***************" << endl;
   cout << "cur: " << i << endl;
   cout << "name: " << h[i].name << endl;
   cout << "age: " << h[i].age << endl;
   cout << "score: " << h[i].score << endl;
  }
 }

};


template<class T>
void Heap<T>::build(){
 for(int i = (n / 2) - 1; i >= 0; i--){
  heapify(i);
 }
}
/**
* 插入的過程就是將data放到數組下標為n的
* 那里,也就是數組的最后一個的元素后面
*  
* 插入之后需要做的就是做保持堆性質的工作,這個非常簡單
* 因為所做的工作就是將新增的data放到一條【有序鏈】上的合適位置(放入data后依然有序)
* 這條有序鏈就是【data的上一個元素】到root之間的一條鏈,這條鏈絕對是有序的
* 你就完全將這條鏈當做是一個數組(只是上一個元素的下標不是減一)
* 假如需要放的位置是m, 那么就將m ―――― (n - 1)的元素全部向下移動,然后將鏈尾被
* 擠出來的data放到位置m那里就好了
*/

template<class T>
void Heap<T>::insert(T data){
 h[n++] = data;
 T tmp = data;  //將新增的節點保存
 int cur = n - 1; //當前節點,由于之前n++過了,所以減一
 //循環找到合適放tmp的位置,并不斷向后移動元素給待放的tmp騰出位置
 while(cur > 0 && h[P(cur)] < tmp){  //當tmp比cur的父親大的時候
  h[cur] = h[P(cur)];
  cur = P(cur);
 }
 //現在的cur位置就是合適放tmp的位置了
 h[cur] = tmp;
}
/**
* 調整cur這棵樹滿足堆(最大堆)
* 從cur的兩個孩子中找到最大值A和cur交換
* 然后從剛才最大值A中那個節點的位置遞歸調整(向下調整)
*/

template<class T>
void Heap<T>::heapify(int cur){
 T mmax = h[L(cur)] > h[R(cur)] ? h[L(cur)] : h[R(cur)];
 if(mmax < h[cur])
  return;
 //cout << "##########" << endl;
 //mmax.show();
 if(h[L(cur)] == mmax){
  h[0].swap(h[cur], h[L(cur)]);
  heapify(L(cur)); 
 }else{
  h[0].swap(h[cur], h[R(cur)]);
  heapify(R(cur));
 }
 //cout << "##########" << endl;

}

int main(){
 int num = 7;
 dNode d[M];
 for(int i = 0; i < num; i++){
  d[i] = dNode("Luo", rand() % 50, rand() % 11);
 }
 d[0].score = 10;
 d[1].score = 33;
 d[2].score = 22;
 d[3].score = 43;
 d[4].score = 7;
 d[5].score = 66;
 d[6].score = 1;

 Heap<dNode> *h = new Heap<dNode>(d, num);
 h->build();

 h->insert(d[1]);
 h->insert(d[3]);
 h->show();
 cout << "########### test top and pop ####" << endl;
 h->top().show();
 h->pop();
 h->top().show();


 return 0;
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线播放国产精品| 亚洲一区二区三区四区在线播放| 91国产美女在线观看| 日韩av成人在线观看| 欧美午夜女人视频在线| 91九色单男在线观看| 成人午夜在线影院| 国产精品电影网| 91国内免费在线视频| 日韩av高清不卡| 日本一区二区在线免费播放| 欧美xxxx18国产| 色偷偷91综合久久噜噜| 国模精品一区二区三区色天香| 亚洲国产精品女人久久久| 中文字幕欧美日韩| 一区二区三区视频观看| 亚洲女人天堂av| 欧美高清不卡在线| 亚洲精品国产精品国自产在线| 色老头一区二区三区| 亚洲精品久久久久久下一站| 国产精品露脸av在线| 国产精品久久99久久| 1769国内精品视频在线播放| 色综合久久88| 日韩激情片免费| 日韩在线观看免费高清| 色yeye香蕉凹凸一区二区av| 97在线精品视频| 91欧美精品成人综合在线观看| 日韩精品免费在线观看| 亚洲激情 国产| 久久久久一本一区二区青青蜜月| 亚洲激情视频网| 国产97在线观看| 日韩精品在线第一页| 亚洲欧洲国产精品| 国内精品久久久久久中文字幕| 成人国产精品一区| 不卡中文字幕av| 欧美自拍大量在线观看| 九九九热精品免费视频观看网站| 国产精品亚洲视频在线观看| 51午夜精品视频| 精品亚洲夜色av98在线观看| 久久精品99国产精品酒店日本| 日韩精品亚洲精品| 国产精品久久久久久久7电影| 日韩中文字幕精品视频| 国产成人短视频| 欧美日韩国产麻豆| 国产精品成熟老女人| 中文字幕九色91在线| 992tv在线成人免费观看| 精品国产成人在线| 日本精品中文字幕| 色综合视频一区中文字幕| 国产精品精品一区二区三区午夜版| 中文字幕日韩欧美| 福利二区91精品bt7086| 久久久久久久国产| 日韩av黄色在线观看| 欧美综合在线第二页| 亚洲精品色婷婷福利天堂| 亚洲丁香久久久| 欲色天天网综合久久| 日韩av电影手机在线观看| 国产精品久久99久久| 亚洲免费一在线| 精品视频在线播放免| 在线观看精品国产视频| 日韩在线中文字幕| 欧美老少做受xxxx高潮| 亚洲综合精品伊人久久| 91免费的视频在线播放| 日韩视频永久免费观看| 亚洲高清一区二| 精品视频—区二区三区免费| 成人网在线免费观看| 福利精品视频在线| 91精品视频播放| 日韩在线视频线视频免费网站| 高跟丝袜一区二区三区| 91久久在线播放| 国产精品第七十二页| 欧美午夜无遮挡| 日本久久亚洲电影| 国产欧美在线看| 欧美一级高清免费播放| 欧美在线性视频| 夜夜躁日日躁狠狠久久88av| 久久中文字幕一区| 自拍偷拍亚洲在线| 不卡伊人av在线播放| 国产日韩欧美影视| 欧美成在线观看| 狠狠躁夜夜躁人人躁婷婷91| 国产国语videosex另类| 国产91在线播放九色快色| 色爱精品视频一区| 亚洲成色777777在线观看影院| 91精品国产色综合| 国产精品午夜一区二区欲梦| 亚洲欧美国产视频| 中文字幕日韩欧美在线| 久久久久久久av| 69视频在线播放| 亚洲国产精品成人av| 久久久久久免费精品| 日韩精品视频中文在线观看| 亚洲综合中文字幕在线| 亚洲精品美女在线观看| 亚洲国产精品国自产拍av秋霞| 国产一区二中文字幕在线看| 亚洲人av在线影院| 日韩的一区二区| 主播福利视频一区| 久久99国产精品久久久久久久久| 国产精品美女免费| 国产精品久久久久久av福利软件| 久久精品电影网| 亚洲一区二区三区乱码aⅴ蜜桃女| 丝袜美腿亚洲一区二区| 91久久夜色精品国产网站| 亚洲精品久久久一区二区三区| 91九色国产在线| 国语自产精品视频在线看| 国产精品久久久久久久久粉嫩av| 久久天天躁狠狠躁老女人| 日韩精品视频免费专区在线播放| 亚洲黄页网在线观看| 久久精品国产亚洲精品2020| 国产成人精品在线| 欧美成人sm免费视频| 亚洲激情视频网| 欧美成人中文字幕在线| 欧美激情一级二级| 深夜精品寂寞黄网站在线观看| 欧美高清理论片| 在线观看国产精品日韩av| 成人精品视频99在线观看免费| 国模吧一区二区| 欧美激情综合亚洲一二区| 国产欧美精品日韩| 91在线播放国产| 亚洲欧美中文字幕在线一区| 亚洲成av人乱码色午夜| 国产亚洲激情视频在线| 国产精品美女无圣光视频| 国产精品第100页| 国产一区二区三区在线播放免费观看| 成人国产精品久久久| 91午夜理伦私人影院| 欧美激情免费看| 亚洲精品久久视频| 久久av红桃一区二区小说| 欧美做受高潮电影o| 福利视频第一区| 国产亚洲精品久久| 国产日韩精品视频| 亚洲视频一区二区| 久久97精品久久久久久久不卡| 国产成人精品久久二区二区91|