堆排序的原理:
堆是一棵完全二叉树,堆满足两个属性:
(1)堆的每一个父节点的值都大于(或小于)其子节点;
(2)树是完全平衡的,最底层的叶节点都位于最左边的位置上。
大顶堆:
(1)首先,通过“左右节点”与“父节点”不断地进行比较,得出最大值作为根节点,这样就形成了一个大顶堆。
(2)然后把最大值拿出来,放到后面的位置,这样元素就减少一个,之后再去重新建堆。
(3)不断的重复以上操作,最后就有顺序了。
#include <iostream>
#include <stdlib.h>
using namespace std;
/*******************************************/
/* 堆排序
/******************************************/
void swap(int &a, int &b) //位置互换函数
{
int temp = a;
a = b;
b = temp;
}
void Heap(int array[], int length, int index) //堆排序算法(大顶堆)
{
int left = 2 * index + 1; //左节点数组下标
int right = 2 * index + 2; //右节点数组下标
int max = index; //index是父节点
if (left < length && array[left] > array[max]) //左节点与父节点比较
{
max = left;
}
if (right < length && array[right] > array[max]) //右节点与父节点比较
{
max = right;
}
if (array[index] != array[max])
{
swap(array[index], array[max]);
Heap(array, length, max); //递归调用
}
}
void HeapSort(int array[], int size) //堆排序函数
{
for (int i = size / 2 - 1; i >= 0; i--) // 创建一个堆
{
Heap(array, size, i);
}
for (int i = size - 1; i >= 1; i--)
{
swap(array[0], array[i]); //将array[0]的最大值放到array[i]的位置上,最大值往后靠
Heap(array, i, 0); //调用堆排序算法进行比较
}
}
int main(void) //主程序
{
const int n = 6; //数组元素的数量
int array[n];
cout << "请输入6个整数:" << endl;
for (int i = 0; i < n; i++)
{
cin >> array[i];
}
cout << endl; //换行
HeapSort(array, n); // 调用HeapSort函数 进行比较
cout << "由小到大的顺序排列后:" << endl;
for (int i = 0; i < n; i++)
{
cout << "Array" << "[" << i << "]" << " = " << array[i] << endl;
}
cout << endl << endl; //换行
system("pause"); //调试时,黑窗口不会闪退,一直保持
return 0;
}