简单选择排序
void SelectSort(RecType R[],int n)
{
int i,j,k;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++) //在当前无序区中选key最小的
if(R[j].key<R[k].key)
k=j; //k记录目前找到的最小关键字的位置
if(k!=i) //R[i]和R[k]互换
swap(R[i],R[k]);
}
}
堆排序(大根堆)
void sift(RecType R[],int low,int high)
{
int i=low,j=2*i; //R[j]是R[i]的左孩子
RecType tmp=R[i];
while(j<=high)
{
if(j<high && R[j].key<R[j+1].key) //若右孩子较大,把j指向右孩子
j++;
if(tmp.key<R[j].key //若根节点小于最大孩子的关键字
{
R[i]=R[j]; //将R[j]调整到双亲结点
i=j; //修改i,j的值以便继续向下筛选
j=2*i
}
else break; //若根节点大于等于最大孩子结点关键字,结束
}
R[i]=tmp; //被筛选结点放入最终位置
}
void HeapSort(RecType R[],int n)
{
int i;
for(i=n/2;i>=1;i--) //循环建立初始堆,调用sift算法n/2次
sift(R,i,n);
for(i=n;i>=2;i--) //进行n-1次完成堆排序,每一次堆中元素减一
{
swap(R[1],R[i]); //将最后一个元素和根R[1]交换
sift(R,1,i-1); //对R[1..i-1]进行筛选,得到i-1个结点的堆
}
}