堆排序(1)HeapSort

来源:互联网 发布:淘宝店铺旺旺号 编辑:程序博客网 时间:2024/05/20 00:38

heap_sort.h


#ifndef HEAP_SORT_H#define HEAP_SORT_H#include "utility.h"typedef int ElemType;class Sort{public:static void HeapSort(ElemType *arr,size_t n);private:static void BuildMaxHeap(ElemType *arr,size_t n);  //数组应该有(n+1)个元素,第0个置空static void HeapAdjust(ElemType *arr,size_t i,size_t n);static void Swap(ElemType &e1,ElemType &e2);DISALLOW_COPY_AND_ASSIGN(Sort);};#endif

utility.h

/*----------------------------------------------- Created By EverSteins Email:EverSteins@gmail.com转载请注明出处------------------------------------------------*/ #ifndef UTILITY_H#define UTILITY_H#include <cstddef>#include <cstdlib>#include <cassert>#include <stdlib.h>#define DISALLOW_COPY_AND_ASSIGN(TypeName) \  TypeName(const TypeName&);               \  void operator=(const TypeName&)#endif

heap_sort.cc


/*-----------------------------------------------  Created By EverSteins  Email:EverSteins@gmail.com 转载请注明出处 ------------------------------------------------*/ #include "stdafx.h"#include <iostream>#include "utility.h"#include "heap_sort.h"using namespace std;void Sort::HeapSort(ElemType *arr,size_t n){BuildMaxHeap(arr,n);for (size_t i=n;i>1;--i)    //注意i>1,循环(n-1)次。而不是循环(n-2)次{//key:将堆顶记录和当前未排序子序列的最后一个记录交换Swap(arr[1],arr[i]);    //注意下标是1HeapAdjust(arr,1,i-1);  //注意是i-1}}void Sort::BuildMaxHeap(ElemType *arr,size_t n){//构造一个大顶堆for (size_t i=n/2;i>0;--i)HeapAdjust(arr,i,n);}void Sort::HeapAdjust(ElemType *arr,size_t i,size_t n){//summmary:确保i结点的子树中(包括i结点)i结点是最大的//pre:1<=i<=n,数组arr应该有(n+1)个空间//已知[i,n]中的记录除i外均满足堆的定义//j总是为2*i或2*i+1ElemType tmp=arr[i];for (size_t j=2*i;j<=n;j*=2){if (j<n && arr[j]<arr[j+1]) ++j;           //j为i左右子结点中较大的结点if (arr[j]<=tmp)   break;arr[i]=arr[j];  //将左右子结点中较大的结点赋值给父结点i=j; //i为变量是因为要始终成为j的父结点以赋值}//3种情况:1)传进来的参数i没有子结点 2)传进来的参数i是三结点(或两结点)中最大值 //3)(至少进入2次for循环)处于中间链,比左右子结点大 ;或处于底层结点arr[i]=tmp;}void Sort::Swap(ElemType &e1,ElemType &e2){ElemType tmp=e1;e1=e2;e2=tmp;}

main.cc


/*-----------------------------------------------  Created By EverSteins  Email:EverSteins@gmail.com 转载请注明出处 ------------------------------------------------*/ #include "stdafx.h"#include <iostream>#include "utility.h"#include "heap_sort.h"using namespace std;typedef int ElemType;void PrintArray(ElemType *arr,size_t n);int _tmain(int argc, _TCHAR* argv[]){//int arr[]={0,9,8,7,23,6,4,3,2,1,0};  //注意第一个元素没有意义,为哑元素。i从1开始int arr[]={0,8};size_t n=sizeof(arr)/sizeof(arr[0])-1;PrintArray(arr,n);Sort::HeapSort(arr,n);PrintArray(arr,n);system("pause");return 0;}void PrintArray(ElemType *arr,size_t n){for (size_t i=1;i<=n;++i)cout<<arr[i]<<' ';cout<<endl;}