1.堆排序
1)首先将序列构建为大顶堆 ;
2)取出当前大顶堆的根结点,将其与序列末尾元素进行交换(此时末尾元素为已排序序列的最大值);
3)对交换后的n-1个序列元素进行调整,使其满足大顶堆的性质;
4)重复2、3步骤,直到堆中只有一个元素位置
2.数据结构-堆
详见 数据结构-堆
3.算法
//递归方式构建堆,parent为第一个非叶子结点下标,num为数组个数
void buildHeap(int *arr, int num,int parent)
{
// parent的左子节点
int sonLeft = 2 * parent + 1;
// parent的右子节点
int sonRight = 2 * parent + 2;
int temp = parent;
//判断左右孩子和父亲中的最大值,获取下标索引值
if (sonRight < num && arr[sonRight] > arr[temp])
{
temp = sonRight;
}
if (sonLeft < num && arr[sonLeft] > arr[temp])
{
temp = sonLeft;
}
if (temp != parent)
{
swap(arr[temp], arr[parent]);
buildHeap(arr, num, temp);
}
}
//堆排序
void heapSort(int *arr, int num)
{
// 构建大根堆(从最后一个非叶子节点向上)
for (int i = num / 2 - 1; i >= 0; i--)
{
buildHeap(arr, num, i);
}
//先将第一个元素和已经排好的元素前一位做交换,再从新调整(刚调整的元素之前的元素),直到排序完毕
for (int i = num - 1; i > 0; i--)
{
swap(arr[0], arr[i]);
buildHeap(arr, i ,0);
}
}
int main()
{
int a[] = { 9,1,2,0,5,7,4,8,6,3,5 };
cout << "排序前: " << endl;
printArr(a, 11);
heapSort(a, 11);
cout << "\n";
cout << "排序后: " << endl;
printArr(a, 11);
return 0;
}