首页 > 代码库 > 堆的数据类
堆的数据类
//// Created by liuyubobobo on 8/15/16.//#ifndef INC_05_HEAPIFY_HEAP_H#define INC_05_HEAPIFY_HEAP_H#include <algorithm>#include <cassert>using namespace std;template<typename Item>class MaxHeap{private: Item *data; int count; int capacity; void shiftUp(int k){ while( k > 1 && data[k/2] < data[k] ){ swap( data[k/2], data[k] ); k /= 2; } } void shiftDown(int k){ while( 2*k <= count ){ int j = 2*k; if( j+1 <= count && data[j+1] > data[j] ) j ++; if( data[k] >= data[j] ) break; swap( data[k] , data[j] ); k = j; } }public: MaxHeap(int capacity){ data = http://www.mamicode.com/new Item[capacity+1];>
推排序:
template<typename T>void heapSort2(T arr[], int n){ MaxHeap<T> maxheap = MaxHeap<T>(arr,n); for( int i = n-1 ; i >= 0 ; i-- ) arr[i] = maxheap.extractMax();}template<typename T>void heapSort1(T arr[], int n){ MaxHeap<T> maxheap = MaxHeap<T>(n); for( int i = 0 ; i < n ; i ++ ) maxheap.insert(arr[i]); for( int i = n-1 ; i >= 0 ; i-- ) arr[i] = maxheap.extractMax();}
原地堆排序:
template<typename T>void __shiftDown(T arr[], int n, int k){ while( 2*k+1 < n ){ int j = 2*k+1; if( j+1 < n && arr[j+1] > arr[j] ) j += 1; if( arr[k] >= arr[j] )break; swap( arr[k] , arr[j] ); k = j; }}template<typename T>void __shiftDown2(T arr[], int n, int k){ T e = arr[k]; while( 2*k+1 < n ){ int j = 2*k+1; if( j+1 < n && arr[j+1] > arr[j] ) j += 1; if( e >= arr[j] ) break; arr[k] = arr[j]; k = j; } arr[k] = e;}template<typename T>void heapSort(T arr[], int n){ for( int i = (n-1)/2 ; i >= 0 ; i -- ) __shiftDown2(arr, n, i); for( int i = n-1; i > 0 ; i-- ){ swap( arr[0] , arr[i] ); __shiftDown2(arr, i, 0); }}
堆的数据类
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。