#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
void PrintArray(int arr[], int len){
for (int i = 0; i < len; i++){
cout << arr[i] << " ";
}
cout << endl;
}
void my_swp(int* a, int max, int index)
{
int tmp = a[max];
a[max] = a[index];
a[index] = tmp;
}
void heapArrjudge(int*a, int index, int len)
{
//保存当前节点的下标
int max = index;//不直接操作index,这里就是传过来的结点的数组下标
//找出左孩子和右孩子的数组下标并且保存
int lchild = index * 2 + 1;
int rchild = index * 2 + 2;//+1是因为数组下标从0开始,从树节点转换为数组下标时要+1;
//下面比较这个节点的根是不是最大值,把最大值放进根结点.这就是大顶排序
if (a[max] < a[lchild] && lchild < len)//为什么len的长度是数组最后一个下标加1,但不会越界?因为是小于,所以不用-1,这样最多会停在数组的最后一个下标,并不会越界;
{
max = lchild;
}
if (a[max] < a[rchild] && rchild < len)
{
max = rchild;
}
if (max != index)
{
my_swp(a, max, index);
heapArrjudge(a, max, len);
}
}
void HeapSort(int* a, int len)
{
for (int i = len / 2 - 1; i >= 0; i--)//求出最后一个节点位置,为什么要减1,因为数组下标从0开始
{ //如果数组长度是9,9除以2=4.但是第四个数的下标是3
heapArrjudge(a, i, len); //这一次进去时只求出第一个最大的.
}
for (int i = len -1; i >= 0;i-- )
{
my_swp(a,0,i); //此时经过上面的堆排,这时的数组0位置已经变为最大的数.
heapArrjudge(a, 0, i);//每次数组长度--都调用堆排序把最大的数找出来并替换到最后一个位置.
}
}
int main(void)
{
int myArr[] = { 4, 2, 8, 0, 5, 7, 1, 3, 9 };
int len = sizeof(myArr) / sizeof(int);
PrintArray(myArr, len);
//堆排序
HeapSort(myArr, len);
printf("\n");
PrintArray(myArr, len);
printf("\n");
system("pause");
return 0;
}
堆排注释版
最新推荐文章于 2020-02-16 18:17:51 发布