1.简单选择排序
//简单选择排序
void SelectSort(int R[],int n)
{
int i,j,cur;
for(i=1;i<=n;i++){
cur=i;
for(j=i+1;j<=n;j++){
if(R[j]<R[cur])
cur=j;
}
swap(R[i],R[cur]);
}
}
2.堆排序
//对以i作为根的树进行调整,只能保证i调整路径上的节点大小有序
void Sift(int R[],int low,int high)
{
int i=low,j=2*low;
while(j<high)
{
//j<high目的j+1<=high,锁定其较大的孩子进行交换
if(j<high&&R[j]<R[j+1])
j++;
//如果当前节点小于子节点
if(R[i]<R[j])
{
swap(R[i],R[j]);//将父节点与比他大的孩子进行交换
i=j;//父节点到了孩子的地方,i随之变化
j=2*i;//j表示新的左孩子节点
}else//如果目节点大于最大的孩子,则结束
break;
}
}
//堆排序
void HeapSort(int R[],int n)
{
//建立初始堆
for(int i=n/2;i>=1;i--)
Sift(R,i,n);
for(int i=n;i>=2;i--)
{
//将堆的最大值置尾
swap(R[i],R[1]);
//对堆进行调整,并缩减堆的规模
Sift(R,1,i-1);
}
}