zoukankan      html  css  js  c++  java
  • 堆以及堆排序

      1 #include <iostream>
      2 #include <stdlib.h>
      3 using namespace std;
      4 
      5 
      6 const int MAXSIZE = 1000;
      7 
      8 //堆结构体
      9 class Heap {
     10     private:    
     11         int array[MAXSIZE];    //堆数组
     12         int size;        //实际堆节点数
     13         void init();        //初始化堆
     14         void shiftUp(int i);    //向上调整堆
     15         void shiftDown(int i, int end);//向下调整堆
     16     public:
     17         void Insert(int value);    //插入节点
     18         void Delete(int i);    //删除节点
     19         void Display();        //输出堆数组
     20         void Sort();        //堆排序
     21         Heap();
     22 };
     23 
     24 void Heap::shiftUp(int i) {
     25     int p = (i - 1) >> 1, t;    
     26     while (i > 0 && array[i] > array[p]) {//将节点key与父节点的key比较,若大于父节点,则与父节点交换位置,依次向上至根节点
     27         t = array[i];
     28         array[i] = array[p];
     29         array[p] = t;
     30         i = p;
     31         p = (i - 1) >> 1;
     32     }
     33 }
     34 
     35 void Heap::shiftDown(int i, int end) {
     36     int cl = i * 2 + 1, cr = cl + 1, t, tt = -1;
     37     while (cl <= end) {    //将结点与左右子节点较大的一个比较,若小于,则将其与该子节点交换位置,依次向下至叶子节点
     38         tt = -1;
     39         if (cr <= end) {
     40             if (array[i] < array[cl] || array[i] < array[cr]) {
     41                 tt = ((array[cl] > array[cr])?cl:cr);
     42             }
     43         } else if (array[i] < array[cl]) {
     44             tt = cl;
     45         }
     46         if (tt > 0) {
     47             t = array[i];
     48             array[i] = array[tt];
     49             array[tt] = t;
     50             i = tt;
     51             cl = i * 2 + 1;
     52                    cr = cl + 1;
     53         } else {
     54             break;
     55         }
     56     }
     57 }
     58 
     59 void Heap::Insert(int value) {
     60     if (size < MAXSIZE) {    //将节点插入至堆数组的最后,在向上进行调整堆
     61         array[size] = value;
     62         shiftUp(size++);
     63     }
     64 }
     65 
     66 void Heap::Delete(int i) {    //将堆数组最后一个节点移至要删除节点的位置,再向下调整堆
     67     if (i < size && i >= 0) {
     68         array[i] = array[size--];    
     69         shiftDown(i, size);
     70     }
     71 }
     72 
     73 void Heap::Sort() {        //将根结点与堆数组最后一个节点交换,并将堆数组节点数-1, 重新向下调整堆
     74     int i = 1, t;
     75     for (; i < size; ++i) {
     76         t = array[0];
     77         array[0] = array[size - i];
     78         array[size - i] = t;
     79         shiftDown(0, size - i - 1);
     80     }
     81 }
     82 void Heap::Display() {
     83     int j = 0;
     84     while (j < size) {
     85         cout << array[j++] << '\t';
     86     }
     87 }
     88 
     89 void Heap::init() {
     90     int randSize = rand() % 100, i = 0;
     91     size = 0;
     92     while (size < randSize) {
     93         int num = rand() % 100;
     94         Insert(num);
     95     }
     96 }
     97 
     98 Heap::Heap() {
     99     init();
    100 }
    101 
    102 int main(int args, char **argv) {
    103     Heap heap;
    104     heap.Display();
    105     cout << "\nafter sort:" << endl;
    106     heap.Sort();
    107     heap.Display();
    108 }
  • 相关阅读:
    修改weblogic jvm启动参数
    weblogic部署步骤
    weblogic安装步骤
    sqldeveloper 导出数据库
    VO与PO 的理解
    【Hyper-V】与【VirtualBox】【VMware】冲突的解决方法
    xstream 实现simplebean2xml ,xml2simplebean
    eclipse中SVN报错解决
    点击eclipse包报错
    myeclipce项目导入eclipse中报错
  • 原文地址:https://www.cnblogs.com/Sunlnx/p/3399755.html
Copyright © 2011-2022 走看看