堆排序

原创 2016年06月01日 09:13:02
#include<iostream>
using namespace std;
class Heap {
private:
    int *data, size;
public:
    Heap(int length_input) {
        data = new int[length_input];
        size = 0;
    }
    ~Heap() {
        delete[] data;
    }
    void push(int value) {
        data[size] = value;
        int current = size;
        int father = (current - 1) / 2;
        while (data[current] > data[father]) {
            swap(data[current], data[father]);
            current = father;
            father = (current - 1) / 2;
        }
        size++;
    }
    void output() {
        for (int i = 0; i < size; i++) {
            cout << data[i] << " ";
        }
        cout << endl;
    }
    int top() {
         return data[0];
    }
    void update(int pos, int n) {
        int lchild = 2 * pos + 1, rchild = 2 * pos + 2;
        int max_value = pos;
        if (lchild < n && data[lchild] > data[max_value]) {
            max_value = lchild;
        }
        if (rchild < n && data[rchild] > data[max_value]) {
            max_value = rchild;
        }
        if (max_value != pos) {
            swap(data[pos], data[max_value]);
            update(max_value, n);
        }
    }
    void pop() {
        swap(data[0], data[size - 1]);
        size--;
        update(0, size);
    }

    void heap_sort(){
        //堆顶每次都为当前堆的最值,挑出堆顶元素
        //放入堆的最末尾(与末尾元素交换)
        //原本末尾元素作为临时堆顶,原堆顶元素相当于被挑出来的当前堆最值
        //再对挑出最值得新堆进行下一个最值的寻找,
        //即调整新堆,找出新堆堆顶
        for(int i=size-1;i>=1;i--){
            //如果循环到0,就是自己和自己交换
            swap(data[i],data[0]);
            //最值被选出到i位置

            //挑出最值后,更新剩下的元素
            update(0,i);
        }
    }
};
int main() {
    int arr[10] = { 12, 9, 30, 24, 30, 4, 55, 64, 22, 37 };
    Heap heap(100);
    for (int i = 0; i < 10; i++) {
        heap.push(arr[i]);
    }
    heap.output();
    cout << heap.top() << endl;
    heap.pop();
    heap.output();
    heap.heap_sort();
    heap.output();
    return 0;
}
版权声明:ShirleyPaul原创,未经博主允许不得转载

相关文章推荐

堆排序之Java实现

  • 2017年07月27日 17:03
  • 4KB
  • 下载

堆排序法.cpp

  • 2015年07月26日 12:45
  • 2KB
  • 下载

假期小算法--堆排序(啊哈算法)

#include const int SIZE_ARRAY = 101; int heap[SIZE_ARRAY] = {0}; // 堆中元素 int n;//堆中元素个数 //交换函数 v...

堆排序及其用途

  • 2016年03月25日 13:46
  • 214KB
  • 下载

堆排序算法c语言实现

  • 2015年10月25日 14:24
  • 2KB
  • 下载

[算法与数据结构] - No.6 堆排序

首先,什么叫堆呢? 堆 ( Heap )设有一个关键字集合,按完全二叉树的顺序存储方式存放在一个一维数组中。对它们从根开始,自顶向下,同一层自左向右从 1开始连续编号。若满足            K...

堆排序

  • 2014年12月25日 21:57
  • 205KB
  • 下载

堆排序算法导论

  • 2013年11月11日 23:54
  • 152KB
  • 下载

Java 堆排序(大顶堆、小顶堆)

引用:http://lib.csdn.net/article/datastructure/8973 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结...
  • Sun_Ru
  • Sun_Ru
  • 2016年07月23日 14:10
  • 4682

堆排序算法

  • 2013年10月27日 09:53
  • 5KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:堆排序
举报原因:
原因补充:

(最多只允许输入30个字)