堆排序
#include<stdio.h>
#include<stdlib.h>
#define MAX 1000
int heap[MAX];
int n,size;
void swap(int u,int t){
int cnt=heap[u];
heap[u]=heap[t];
heap[t]=cnt;
}
void down(int u){
// 与最小的交换
int t=u;
if(2*u<=size&&heap[2*u]<heap[t])
t=2*u;
if(2*u+1<=size&&heap[2*u+1]<heap[t])
t=2*u+1;
if(u!=t)
{
swap(u,t);
down(t);
}
}
int main(){
int k=1;
FILE *fp,*fo;
fp=fopen("in.txt","r");
fo=fopen("out.txt","w");
fscanf(fp,"%d",&n);
while(n!=-1)
{
size=n;
fprintf(fo,"Case %d : %d\n",k++,n);
// 读取 数列
for(int i=1;i<=n;i++)
{
fscanf(fp,"%d",&heap[i]);
}
for(int i=n/2;i;i--) // ? 1.为什么是n/2 ? 2. 为什么从n/2-0 而不是反过来?
{ // 1.只有n/2这些节点有孩子结点。 2.确保最后结果不会被打乱,因为最后从1开始,可以遍历整个堆一遍,确保最后结果1号是最小的。
down(i);
}
while(n--)
{
fprintf(fo,"%d ",heap[1]);
heap[1]=heap[size--];
down(1);
}
fprintf(fo,"\n");
fscanf(fp,"%d",&n);
}
fclose(fo);
fclose(fp);
}
/*
堆是一个完全二叉树
结点小于左右儿子,所以根节点最小
*/
归并排序
快速排序
三种排序的时间复杂度都是O(nlogn)