堆排序(HeapSort)
堆排序(HeapSort):是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。(大堆排序和小堆排序)
堆操作:
①最大堆调整(Adjust):将堆的末端子节点作调整,使得子节点永远小于父节点
②创建最大堆:将堆中的所有数据重新排序
③堆排序(HeapSort):移除位在第一个数据的根节点,并做最大堆调整的递归运算
思想:运用最大堆调整,首先将数组看为一棵完全二叉树,arr[0]为根,arr[i]左子树右子树分别为arr[i+1]和arr[i+2]。首先创建最大堆,将堆中的所有数据重新排序,不满足子节点永远小于父节点则进行最大堆调整使其满足。得到最大堆。然后将最大堆进行堆排序移除位在第一个数据的根节点,并做最大堆调整的递归运算(将不包括0在内的所有节点和0进行交换值后adj调整)最终的得到由小到大序列。
代码如下
#include<iostream>
#include<malloc.h>
void Adj(int arr[],int len,int nRootID)
{
int Max;
for(Max = 2*nRootID+1;Max < len;Max = 2*nRootID+1)
{
if(2*nRootID+2 < len)
if(arr[Max] < arr[2*nRootID+2])
Max = 2*nRootID+2;
if(arr[Max] > arr[nRootID])
{
arr[Max] = arr[Max]^arr[nRootID];
arr[nRootID] = arr[Max]^arr[nRootID];
arr[Max] = arr[Max]^arr[nRootID];
nRootID = Max;
}
else
return;
}
}
void HeapSort(int arr[],int len)
{
if(arr == NULL || len <= 0) return;
int i;
for(i = len / 2 - 1; i >= 0; i--)
{
if(2*i+1 > i && 2*i+2 > i && 2*i+1 < len && 2*i+2 < len)
Adj(arr,len,i);
}
for(i = len-1; i > 0; i--)
{
arr[0] = arr[0]^arr[i];
arr[i] = arr[0]^arr[i];
arr[0] = arr[0]^arr[i];
Adj(arr,i,0);
}
}
int main()
{
int *arr = NULL; //指针==数组 指针需要初始化
int n,len;
cin>>n;
arr = (int*)malloc(sizeof(int)*n); //指针使用需要malloc空间(malloc空间虚拟地址连续,物理地址不一定连续)
for(int i = 0; i < n; i++)
{
cin>>arr[i];
}
HeapSort(arr,n);
for(int i = 0; i < n; i++)
{
cout<<arr[i]<<" ";
}
free(arr);
arr = 0;
return 0;
}
时间复杂度
(1/2 + (n-1))*log2^n
时间复杂度为O(nlogn)