堆排序(用了好多的位运算)
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=10000;
int a[maxn];
int main(){
int i,j,k,m=0,n,t;
scanf("%d",&n);
int top=1;//模拟堆顶
for(i=1;i<=n;i++){
scanf("%d",&a[i]);//显然这不用多解释,输入;
int len=i;
while(len>1&&a[len]<a[len/2]){//每次输入一个数便将最小数放在堆顶 ;
swap(a[len],a[len/2]);//如果他的儿子大于它的父亲,便将其交换;
len/=2;
}
}
m=n;
for(i=1;i<=n;i++){//将其变为小根堆树;
printf("%d ",a[1]);
a[1]=a[m];m--;//将叶子节点放置堆顶往下沉,这是堆排的特性,因为堆的叶子节点是根节点;
top=1;
while((a[top]>a[top<<1]&&(top<<1)<=m)||(a[top]>a[top<<1|1]&&((top<<1|1)<=m))){//每次将其交换
t=(top<<1);
if(a[t]>a[t+1] && t+1<=m)t++;//如果左儿子大于右儿子便将其变成右儿子,便于之后的交换,将最小的永远放置堆顶 ;
swap(a[top],a[t]);
top=t;
}
qsort("","","""");
//for(j=1;j<=m;j++)printf("%d ",a[j]);
//puts("");//调试程序;
}
return 0;
}
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=10000;
int a[maxn];
int main(){
int i,j,k,m=0,n,t;
scanf("%d",&n);
int top=1;//模拟堆顶
for(i=1;i<=n;i++){
scanf("%d",&a[i]);//显然这不用多解释,输入;
int len=i;
while(len>1&&a[len]<a[len/2]){//每次输入一个数便将最小数放在堆顶 ;
swap(a[len],a[len/2]);//如果他的儿子大于它的父亲,便将其交换;
len/=2;
}
}
m=n;
for(i=1;i<=n;i++){//将其变为小根堆树;
printf("%d ",a[1]);
a[1]=a[m];m--;//将叶子节点放置堆顶往下沉,这是堆排的特性,因为堆的叶子节点是根节点;
top=1;
while((a[top]>a[top<<1]&&(top<<1)<=m)||(a[top]>a[top<<1|1]&&((top<<1|1)<=m))){//每次将其交换
t=(top<<1);
if(a[t]>a[t+1] && t+1<=m)t++;//如果左儿子大于右儿子便将其变成右儿子,便于之后的交换,将最小的永远放置堆顶 ;
swap(a[top],a[t]);
top=t;
}
qsort("","","""");
//for(j=1;j<=m;j++)printf("%d ",a[j]);
//puts("");//调试程序;
}
return 0;
}