先写代码,说明随后补上。
// HeapSort.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
//较大堆元素下移
void HeapBigDown(int arr[], int i, int n)
{
int temp = arr[i];
int j = i * 2 + 1;
while(j < n)
{
if(j + 1 < n && arr[j+1] < arr[j])//先找到较小元素的索引号
{
j++;
}
if(arr[j] >= temp)
break;
arr[i] = arr[j];
i = j;
j = i * 2 + 1;
}
arr[i] = temp;
}
void HeapSmallDown(int arr[], int i, int n)
{
int temp = arr[i];
int j = i * 2 + 1;
while(j < n)
{
if(j + 1 < n && arr[j] < arr[j+1])//获取较大子节点的索引
{
j++;
}
if(arr[j] < temp)//较大的子节点比父节点还小,则退出
break;
arr[i] = arr[j];
i = j;
j = i * 2 + 1;
}
arr[i] = temp;
}
//建立堆结构
void CreateHeap(int arr[], int n)
{
for(int i = (n - 1)/2; i >= 0; --i)
{
//n为元素总个数
HeapBigDown(arr, i, n);
}
}
void CreateBigHeap(int arr[], int n)
{
for(int i = (n-1)/2; i >= 0; --i)
{
HeapSmallDown(arr, i, n);
}
}
void Print(int arr[], int n)
{
for(int i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
void swap(int &n1, int &n2)
{
int temp = n1;
n1 = n2;
n2 = temp;
}
void Sort(int arr[], int n)
{
for(int i = n - 1; i >= 0; --i)
{
swap(arr[0], arr[i]);//第一个元素为最小值
HeapBigDown(arr, 0, i);//此时i代表元素总个数,在HeapBigDown不会处理arr[i]这个元素
}
}
void SortAscend(int arr[], int n)
{
for(int i = n-1; i >= 0; i--)
{
swap(arr[0], arr[i]);
HeapSmallDown(arr, 0, i);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int arr[] = {9, 12, 17, 30, 50, 20, 60, 65, 4, 49};
CreateBigHeap(arr, 10); //建立大根堆
Print(arr, 10);
SortAscend(arr, 10);
Print(arr, 10);
//CreateHeap(arr, 10); //建立小根堆
//Print(arr, 10);
//Sort(arr, 10);
//Print(arr, 10);
getchar();
return 0;
}