From f12e4545d945aa4646e215493fb798de17d7900e Mon Sep 17 00:00:00 2001 From: Julien David <david@lipn.univ-paris13.fr> Date: Mon, 18 Oct 2021 14:20:43 +0200 Subject: [PATCH] Ajout code Tas + HeapSort --- src/binary_heap.hpp | 114 ++++++++++++++++++++++++++++++++++++++++ src/max_binary_heap.hpp | 20 +++++++ src/min_binary_heap.hpp | 20 +++++++ src/test | Bin 0 -> 48128 bytes src/test.cpp | 52 ++++++++++++++++++ 5 files changed, 206 insertions(+) create mode 100644 src/binary_heap.hpp create mode 100644 src/max_binary_heap.hpp create mode 100644 src/min_binary_heap.hpp create mode 100755 src/test create mode 100644 src/test.cpp diff --git a/src/binary_heap.hpp b/src/binary_heap.hpp new file mode 100644 index 0000000..e62e974 --- /dev/null +++ b/src/binary_heap.hpp @@ -0,0 +1,114 @@ +#ifndef __BINARY_HEAP_HPP__ +#define __BINARY_HEAP_HPP__ +#include<iostream> +#include <exception> + +class FullBinaryHeapException: public std::exception{ + virtual const char* what() const throw() + { + return "Cannot add value in a full Heap"; + } +}; + + + +template <typename T> +class BinaryHeap{ +private: + T * data; + size_t size; + size_t max; + size_t counter_swap_up; + size_t counter_swap_down; + +protected: + virtual bool heap_cmp(T & value1, T & value2) = 0; + +public: + BinaryHeap(size_t max){ + this->max = max; + this->size = 0; + this->data = new T[max]; + counter_swap_up = 0; + counter_swap_down = 0; + } + + ~BinaryHeap(){ + delete this->data; + } + + bool isEmpty(){ + return size == 0; + } + + size_t getSize(){ + return this->size; + } + + void resetCounters(){ + counter_swap_up = 0; + counter_swap_down = 0; + } + + size_t getSwapsCounters(){ + return counter_swap_down + counter_swap_up; + } + + inline int parent(int position){ + return (position-1)/2; + } + + inline int left_child(int position){ + return position*2+1; + } + + inline int right_child(int position){ + return position*2+2; + } + + void heapify_up(int position){ + while(position > 0 && heap_cmp(data[position], data[parent(position)])){ + std::swap(data[parent(position)], data[position]); + counter_swap_up++; + position = parent(position); + } + } + + void heapify_down(int position){ + int min_child; + min_child = heap_cmp(data[left_child(position)], data[right_child(position)])? left_child(position): right_child(position); + while(min_child < (size-1) && heap_cmp(data[min_child], data[position])){ + std::swap(data[min_child], data[position]); + position = min_child; + min_child = heap_cmp(data[left_child(position)],data[right_child(position)])? left_child(position): right_child(position); + counter_swap_down++; + } + } + + void insert(T value) { + if(size == max) + throw new FullBinaryHeapException(); + data[size++] = value; + heapify_up(size-1); + } + + T extract(){ + std::swap(data[0], data[size-1]); + heapify_down(0); + return data[--size]; + } + + friend std::ostream& operator<<(std::ostream& os, const BinaryHeap<int>& heap); + +}; + +std::ostream& operator<<(std::ostream& os, const BinaryHeap<int>& heap) +{ + for( int i = 0; i < heap.size; i++) + os<<heap.data[i]<<" "; + os<<std::endl; + return os; +} + + +#endif diff --git a/src/max_binary_heap.hpp b/src/max_binary_heap.hpp new file mode 100644 index 0000000..e8852a9 --- /dev/null +++ b/src/max_binary_heap.hpp @@ -0,0 +1,20 @@ +#ifndef __MAX_BINARY_HEAP_HPP__ +#define __MAX_BINARY_HEAP_HPP__ +#include<iostream> + +#include"binary_heap.hpp" + +template <typename T> +class MaxBinaryHeap: public BinaryHeap<T>{ +protected: + bool heap_cmp(T & value1, T & value2){ + return value1 > value2; + } + +public: + MaxBinaryHeap(size_t max): BinaryHeap<T>(max){} + +}; + + +#endif diff --git a/src/min_binary_heap.hpp b/src/min_binary_heap.hpp new file mode 100644 index 0000000..db3a366 --- /dev/null +++ b/src/min_binary_heap.hpp @@ -0,0 +1,20 @@ +#ifndef __MIN_BINARY_HEAP_HPP__ +#define __MIN_BINARY_HEAP_HPP__ +#include<iostream> + +#include"binary_heap.hpp" + +template <typename T> +class MinBinaryHeap: public BinaryHeap<T>{ +protected: + bool heap_cmp(T & value1, T & value2){ + return value1 < value2; + } + +public: + MinBinaryHeap(size_t max): BinaryHeap<T>(max){} + +}; + + +#endif diff --git a/src/test b/src/test new file mode 100755 index 0000000000000000000000000000000000000000..0d6511c33bfabebdbfdafdf8862923c4b02c4de6 GIT binary patch literal 48128 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 literal 0 HcmV?d00001 diff --git a/src/test.cpp b/src/test.cpp new file mode 100644 index 0000000..374d02a --- /dev/null +++ b/src/test.cpp @@ -0,0 +1,52 @@ +#include<iostream> +#include"min_binary_heap.hpp" + + +MinBinaryHeap<int> * initialize_heap(size_t size){ + static MinBinaryHeap<int> * mbh = NULL; + if(mbh == NULL) + mbh = new MinBinaryHeap<int>(size); + else if(mbh->getSize() < size){ + delete mbh; + mbh = new MinBinaryHeap<int>(size); + } + return mbh; +} + +size_t heap_sort(int * permutation, size_t size){ + int i; + MinBinaryHeap<int> * mbh = initialize_heap(size); + mbh->resetCounters(); + for(i = 0; i < size; i++) + mbh->insert(permutation[i]); + for(i = 0; i < size; i++) + permutation[i] = mbh->extract(); + return mbh->getSwapsCounters(); +} + + + +void random_permutation(int * permutation, size_t size){ + int i; + for(i = 0; i < size; i++) + permutation[i] = i; + for(i = 0; i < size; i++) + std::swap(permutation[i], permutation[i+rand()%(size-i)]); +} + +int main(int argc, char ** argv){ + int permutation[1024]; + int size, xp; + int xp_num = 1000; + double mean; + + for(size = 4; size <= 1024; size = 2*size){ + mean= 0; + for(xp = 0; xp < xp_num; xp++){ + random_permutation(permutation, size); + mean +=heap_sort(permutation, size); + } + printf("%d %lf\n", size, mean/xp_num); + } + return EXIT_SUCCESS; +} -- GitLab