#include <iostream>
using namespace std;
typedef struct
{
int r[100+1];
int length;
}SqList;
//简单选择排序
void SimpleSlectSort(SqList &L)
{
int min,i,j;
for(i=1;i<L.length;i++)
{
min=i;
for(j=i+1;j<=L.length;j++)
if(L.r[j]<L.r[min])
min=j;//找到无序区中最小的元素
if(i!=min)
{//在i所指的元素不是最小记录的情况下
L.r[0]=L.r[i];
L.r[i]=L.r[min];
L.r[min]=L.r[0];
}
}
}
//堆排序
void HeapAdjust(SqList &L,int low,int high)
{//该函数的作用是以low为顶点,以high为无序区的最后一个元素,建堆
int j;
L.r[0]=L.r[low];//把low中的元素存在0号单元中,以后就和0号单元作比较
for(j=2*low;j<=high;j*=2)
{
if(j<high && L.r[j]<L.r[j+1])
j++;//找到两个孩子中的较大者
if(L.r[0]>=L.r[j])
break;/*因为从最后一个分支结点开始建堆的,所以当前结点之后的全部结点
已全部是堆,如果当前结点比左右孩子都大,则该结点已是一个堆,不
用考虑后面的结点了,故应直接跳出循环。*/
else
{
L.r[low]=L.r[j];
low=j;
}
L.r[low]=L.r[0];
}
}
void HeapSort(SqList &L)
{
int i,high;
for(i=L.length/2;i>0;i--)
HeapAdjust(L,i,L.length);//初始建堆
for(high=L.length;high>1;high--)
{
L.r[0]=L.r[1];
L.r[1]=L.r[high];
L.r[high]=L.r[0];//堆顶和最后一个元素互换
HeapAdjust(L,1,high-1);//从堆顶再进行调整
}
}
void main()
{
//freopen("in.txt","r",stdin);
SqList L;
int i;
cin>>L.length;
for(i=1;i<=L.length;i++)
cin>>L.r[i];
SimpleSlectSort(L);
for(i=1;i<=L.length;i++)
cout<<L.r[i]<<" ";
cout<<endl;
HeapSort(L);
for(i=1;i<=L.length;i++)
cout<<L.r[i]<<" ";
}
标签:结点,int,堆排序,C++,high,length,low,SqList,排序 From: https://blog.51cto.com/u_5173797/7251982