堆排序
问题:对可以分为大顶堆和小顶堆。
大顶堆满足父节点大于左右孩子节点:父节点i,则i>2*i ;i>2*i+1;
小顶堆满足父节点小于左右孩子节点:父节点i,则i<2*i ;i<2*i+1;
指针问题,在交换两个变量时,确保交换,要用指针。
下面代码是小顶堆排序。
代码:
#include <iostream>
using namespace std;
void buildHeap(int arr[],int length) //建立堆
{
int i;
int *min;
int *temp;
int t;
int f;
int k;
int flag;
int n=length/2;
for(i=n;i>0;i--)
{
f=i;
while(2*f<=length) //循环向下判断
{
temp=&arr[f-1];
min=&arr[2*f-1];
flag=2*f;
if(2*f+1<=length)
{
if(arr[2*f]<*min) //选择孩子节点中较小的节点
{
min=&arr[2*f];
flag=2*f+1;
}
}
if(*min<*temp) //父节点小于孩子节点,则交换
{
// cout<<*temp<<":"<<*min<<"--";
t=*temp;
*temp=*min;
*min=t;
f=flag;
// cout<<flag<<"--";
}
else
break;
}
}
}
void heapSort(int arr[],int length) // 堆排序
{
buildHeap(arr,length);
cout<<arr[0]<<" ";
arr[0]=arr[length-1];
}
int main()
{
int arr[10]={9,3,5,1,2,0,4,8,6,7};
int i,j;
cout<<"排序前:"<<endl;
for(i=0;i<10;i++)
{
cout<<arr[i]<<" ";
}
cout<<endl;
cout<<"堆排序后:"<<endl;
for(j=10;j>0;j--)
{
heapSort(arr,j);
}
cout<<endl;
return 0;
}
运行结果:


浙公网安备 33010602011771号