算法导论c++ 堆排序以堆类结构完整实现
来源:互联网 发布:单片机pc地址 编辑:程序博客网 时间:2024/06/02 04:25
程序不当之处,欢迎指正
// HeapSort.cpp: 定义控制台应用程序的入口点。#include "stdafx.h"#include <vector>#include <algorithm> //swap;#include <iostream>using namespace std;class Heap{ private: int size; void Max_heapify(vector<int> &A, int i,int s) { int l = Left(i); int r = Right(i); //找到比父节点大的子节点; int largest=i; if (l < s&&A[l] > A[i]) largest = l; if (r < s&&A[r] > A[largest]) largest = r; if (largest!= i) { swap(A[i],A[largest]); Max_heapify(A, largest,s);//防止子节点违反最大堆的性质; } }//维护堆的性质; void Build_Heap(){ for (int i = size / 2 - 1; i >= 0; i--) { Max_heapify(heap, i,size); } }//构建堆; public: vector<int> heap; Heap(vector<int> array) { heap.assign(array.begin(), array.end()); size = array.size(); Build_Heap(); } int Parent(int index)//父节点; { if (index == 0) return 0; else return (index - 1) / 2; } int Left(int index)//左节点; { return 2 * index + 1; } int Right(int index)//右节点; { return Left(index) + 1; } int HeapSize() { return size; } //优先队列; int MaxIMum()//返回最大值; { return heap[0]; } int Extract_Max()//去除最大值并返回最大值; { if (size< 1) printf("heap underflow"); int max = heap[0]; heap[0] = heap[size-1]; size--; heap.pop_back(); Max_heapify(heap,0,size); return max; } void InsertKey(int x,int key)//x索引值增加到key(key<x处值); { if (key < heap[x]) printf("new key is smaller than current key"); else { heap[x] = key; while (x > 0 && heap[Parent(x)] < heap[x]) { swap(heap[x],heap[Parent(x)]); x = Parent(x); } } } void Insert(int k)//插入值; { size++; heap.push_back(INT_MIN); InsertKey(size - 1, k); } vector<int> Heap_Sort()//堆排序; { vector<int> A;//存储排序的数组; A.assign(heap.begin(), heap.end());; int s = size; for (int i = s-1; i >0; i--) { swap(A[0], A[i]); s--; Max_heapify(A,0,s); } return A;//返回从小到大排序好的数组; }};int main(){ vector<int> Test{ 16,14,10,8,7,9,3,2,4,1 }; Heap newHeap =Heap(Test); //测试节点的获取; cout << "Parent " << newHeap.Parent(3)<<endl;//2 cout << "Left " << newHeap.Left(3) << endl;//7 cout << "Right " << newHeap.Right(3) << endl;//8 //测试堆性质成功维护; for each (int a in newHeap.heap) { cout << a << " " ; } cout << endl; //测试排序结果; vector<int> B = newHeap.Heap_Sort(); for each (int a in B) { cout << a << " "; } cout << endl; //测试sort不影响原排序; for each (int a in newHeap.heap) { cout << a << " "; } cout << endl; //测试最大值; cout << "Max " << newHeap.MaxIMum() << endl; //测试Extract_Max(); cout << newHeap.Extract_Max() << endl; for each (int a in newHeap.heap) { cout << a << " "; } cout << endl; //测试InsertKey; newHeap.InsertKey(5, 100); for each (int a in newHeap.heap) { cout << a << " "; } cout << endl; newHeap.Insert(34); for each (int a in newHeap.heap) { cout << a << " "; } cout << endl; while(true){} return 0;}
阅读全文
0 0
- 算法导论c++ 堆排序以堆类结构完整实现
- 堆排序C语言实现 算法导论
- 算法导论C语言实现: 堆排序
- 算法导论 堆排序 C语言实现
- 算法导论,堆排序,c实现。
- 【算法导论】堆排序实现
- 算法导论堆排序实现
- 算法导论中堆排序c语言实现
- 算法导论:堆排序递归实现 (c语言)
- 算法导论:堆排序非递归实现(c语言)
- 《算法导论》7、堆排序实现(C++)
- 【算法导论实验3】堆结构与堆排序
- 算法导论 堆排序
- 算法导论--堆排序
- 【算法导论】 堆排序
- 算法导论-----堆排序
- 【算法导论】堆排序
- 算法导论-堆排序
- Python学习——用Django建立一个博客
- Node.js调用模块
- 某 APP 跑步模块性能测试
- 新建动态web工程报错
- effective c++读书笔记(七)
- 算法导论c++ 堆排序以堆类结构完整实现
- java基础多目运算符是什么
- 常用工具汇总
- Linux 基础操作(三)————vim进阶使用、输出及管理输出、管道、建立用户或用户组
- ubuntu 14.04 安装 samba
- Caused by: java.lang.ClassNotFoundException: org.hibernate.engine.transaction.spi.TransactionContext
- 利用双向循环链表实现任意长的整数进行加法运算
- POJ2886 Who Gets the Most Candies? 线段树+预处理
- xcode的多版本管理