理论原理:
代码实现:
#include <iostream>
#include <time.h>
#include <windows.h>
using namespace std;
#define MAX 100000
//遍历数组
void printArray(int *arr,int len)
{
for(int i=0;i<len;i++)
{
cout<<arr[i]<<" ";
}
cout<<endl;
}
int arr[MAX];
//创建数组
int* createArray()
{
srand(time(NULL));
for(int i=0;i<MAX;i++)
{
arr[i]=rand()%MAX;
}
return arr;
}
void mySwap(int &a,int &b)
{
int temp=a;
a=b;
b=temp;
}
//堆调整
void heapAdjust(int *arr,int index,int len)
{
//保存当前结点索引
int max=index;
//保存左右孩子结点索引
int lchild=2*index+1;
int rchild=2*index+2;
//调整
if(lchild<len && arr[lchild]>arr[max])
{
max=lchild;
}
if(rchild<len && arr[rchild]>arr[max])
{
max=rchild;
}
if(max!=index)
{
mySwap(arr[index],arr[max]);
//调整过后可能不再构成堆的特性,故须递归
heapAdjust(arr,max,len);
}
}
//堆排序
void heapSort(int *arr,int len)
{
//创建大根堆
for(int i=len/2-1;i>=0;i--)
{
heapAdjust(arr,i,len);
}
//交换调整排序
for(int i=len-1;i>0;i--)
{
mySwap(arr[0],arr[i]);
heapAdjust(arr,0,i);
}
}
int main()
{
int *arr=createArray();
DWORD start=GetTickCount();
// printArray(arr,MAX);
heapSort(arr,MAX);
// printArray(arr,MAX);
DWORD end=GetTickCount();
cout<<"堆排序"<<MAX<<"个数据用时:"<<end-start<<endl;
return 0;
}
运行结果: