// 堆排序
#include<iostream>
using namespace std;
void swap(int arr[], int i, int j)
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
//建立大跟堆 先找到父节点进行比较大小
void bulidHeap(int arr[], int length)
{
for (int index= 0; index < length; index++)
{
while (arr[index] > arr[(index - 1) / 2])
{
swap(arr, index, ((index - 1) / 2));
index = (index - 1) / 2;
}
}
}
//当堆顶的元素出现改变的时候如何变成大跟堆
void heapfiy(int arr[],int index,int heapsize)
{
int left = 2 * index + 1;
while (left < heapsize)//跳出循环的条件是出现越界的情况
{
//两者之间的最大值
int max = left + 1 < heapsize&&arr[left + 1] > arr[left] ? left + 1 : left;
//三者之间的最大值
max = arr[max] > arr[index] ? max : index;
//跳出说明已经时大跟堆了
if (max == index)
{
break;
}
swap(arr, max, index);
//来到下一个堆定把子树变成大跟堆
index = max;
left = 2 * index + 1;
}
}
//堆排序
void sortHeap(int arr[], int length)
{
int size = length;
swap(arr, 0, --size);
while (size > 0)
{
heapfiy(arr,0, size);//调整为大根堆
swap(arr, 0, --size);//把找到的最大值给放到对应的数组中
}
}
//打印数组
void printHeap(int arr[], int length)
{
for (int i = 0; i < length; i++)
{
cout << arr[i] << " ";
}
cout << endl;
}
//堆排序
int main(void)
{
int array[] = {11,22,21,14,17,33};
int length = sizeof(array) / sizeof(array[0]);
cout << length << endl;
bulidHeap(array, length);//建立大根堆
sortHeap(array, length);
printHeap(array, length);
cout << "hello word" << endl;
system("pause");
return 0;
}
堆排序学习心得
最新推荐文章于 2022-03-16 16:24:20 发布