#ifndef _HEAP_SORT_
#define _HEAP_SORT_
/************************************************************************/
/* 堆排序是利用堆顶这个关键字来进行的,将最后一个元素与堆顶元素进行交换*/
/* 并去除最后一个元素,重新调整堆,这样依次下去直到堆中只剩走后一个元素 */
/************************************************************************/
/* 最大值堆排序and最小值堆排序 */
#include <IOSTREAM>
using namespace std;
/* 调整当前元素在最大值堆中的位置,arr为数组名,pos为当前位置,length为数组长度 */
void heapMaxAdjust(int arr[], int pos, int length)
{
int temp, child;
temp = arr[pos];
for (int i = pos; 2 * i + 1 < length; i = child)
{
child = 2 * i + 1;
if ((child + 1) < length && arr[child] < arr[child + 1])
{
child++;
}
if (temp < arr[child])
{
arr[i] = arr[child];
}
else
{
break;
}
arr[child] = temp;
}
}
/* 进行最大值堆排序,arr为数组名,length为数组长度 */
void heapMaxSort(int arr[], int length)
{
int i;
/* 构造最大值堆 */
for (i = length / 2 - 1; i >= 0; i--)
{
heapMaxAdjust(arr, i, length);
}
/* 进行堆排序,直到arr只剩下最后一个元素 */
for (i = length - 1; i>0; i--)
{
//堆的最大值与最后一个元素进行交换,并减少一个堆的元素
int temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
heapMaxAdjust(arr, 0, i); //对交换后的堆进行重新调整成最大堆
}
}
/* 调整当前元素在最小值堆中的位置,arr为数组名,pos为当前位置,length为数组长度 */
void heapMinAdjust(int arr[], int pos, int length)
{
int temp, child;
temp = arr[pos];
for (int i = pos; 2 * i + 1 < length; i = child)
{
child = 2 * i + 1;
if ((child + 1) < length && arr[child] > arr[child + 1])
{
child++;
}
if (temp > arr[child])
{
arr[i] = arr[child];
}
else
{
break;
}
arr[child] = temp;
}
}
/* 进行最小值堆排序,arr为数组名,length为数组长度 */
void heapMinSort(int arr[], int length)
{
int i;
/* 构造最小值堆 */
for (i = length / 2 - 1; i >= 0; i--)
{
heapMinAdjust(arr, i, length);
}
/* 进行堆排序,直到arr只剩下最后一个元素 */
for (i = length - 1; i>0; i--)
{
//堆的最小值与最后一个元素进行交换,并减少一个堆的元素
int temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
heapMinAdjust(arr, 0, i); //对交换后的堆进行重新调整成最小值堆
}
}
#endif
堆排序
最新推荐文章于 2024-09-04 23:05:17 发布