堆排序(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;}
- 堆排序(1)HeapSort
- 堆排序(HeapSort)
- 堆排序(Heapsort)
- 堆排序 (Heapsort)
- 堆排序(heapsort)
- 堆排序(HeapSort)
- 堆排序(heapsort)
- 堆排序(heapsort)
- 堆排序(Heapsort)
- 堆排序(HeapSort)
- 堆排序(Heapsort)
- 堆排序(HeapSort)
- 堆排序(heapsort)
- 堆排序(HeapSort)
- HeapSort(堆排序算法)
- HeapSort(堆排序)入门
- 排序算法 之 堆排序(heapsort)
- Java排序算法--堆排序(HeapSort)
- dede5.7后台部分空白及全部空白解决办法
- 归并排序(2)MergeSort临时分配内存
- Sicily 4495 Print permutations解题报告
- JDK安装方法
- 网页设计:Meta标签详解
- 堆排序(1)HeapSort
- 字符串的输入输出处理
- Ubuntu搭建Eclipse+JDK+SDK的Android
- 模板方法模式、接口、多态、Object类
- 关于mysql的udf插件问题
- 内部类
- 【算法入门】广度/宽度优先搜索(BFS)
- email report template
- 使用KGDB 进行内核调试(平台搭建和调试)