最近想写一写排序。。所以就写了一下可是发现自己基础的知识都不会了,,哎,弱爆了。。。。
二叉树排序的链表实现与数组实现
#include <cstdio>
#include <iostream>
struct node
{
int key;
node *lc,*rc;
}*rt,*p;
void insert(node *rt,int x)
{
if(x<=rt->key)
{
if(rt->lc==NULL) rt->lc=p;
else insert(rt->lc,x);
}
else
{
if(rt->rc==NULL) rt->rc=p;
else insert(rt->rc,x);
}
}
void mid_vt(node *rt)
{
if(rt)
{
mid_vt(rt->lc);
printf("%d ",rt->key);
mid_vt(rt->rc);
}
}
int main()
{
int n,i;
scanf("%d",&n);
for(i=0;i<n;i++)
{
p=new node;
scanf("%d",&p->key);
p->lc=NULL;
p->rc=NULL;
if(rt==NULL)
rt=p;
else
insert(rt,p->key);
}
mid_vt(rt);
return 0;
}
数组
#include <cstdio>
#include <cstring>
#include <iostream>
const int max_s=10000;
int l[max_s],r[max_s],key[max_s];
int ct;
void insert(int rt,int x)
{
if(x<=key[rt])
{
if(l[rt]==-1) l[rt]=ct;
else insert(l[rt],x);
}
else
{
if(r[rt]==-1) r[rt]=ct;
else insert(r[rt],x);
}
}
void mid_vt(int rt)
{
if(l[rt]!=-1) mid_vt(l[rt]);
printf("%d ",key[rt]);
if(r[rt]!=-1) mid_vt(r[rt]);
}
int main()
{
freopen("d.txt","r",stdin);
memset(l,-1,sizeof(l));
memset(r,-1,sizeof(r));
int n,i,x;
int rt;
rt=-1;ct=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&x);
if(rt==-1) key[++rt]=x;
else
{
key[++ct]=x;
insert(rt,x);
}
}
mid_vt(rt);
return 0;
}
快排:
#include <cstdio>
#include <cstring>
#include <iostream>
const int max_s=10007;
int a[max_s];
void Qsort(int a[],int left,int right)
{
int key=a[left];
int l,r;
l=left;r=right;
if(left>=right) return ;//递归出口。。忘了。。。
while(l<r)
{
while(l<r&&a[r]>=key) r--;
a[l]=a[r];
while(l<r&&a[l]<=key) l++;
a[r]=a[l];
}
a[l]=key;
Qsort(a,left,l-1);
Qsort(a,l+1,right);
}
int main()
{
freopen("d.txt","r",stdin);
int n,i;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
Qsort(a,0,n-1);
for(i=0;i<n;i++)
printf("%d ",a[i]);
return 0;
}
归并排序
#include <cstdio>
#include <cstring>
const int max_s=10007;
int a[max_s];
void Merge(int a[],int l,int m,int r)
{
int i,j,k,x[max_s],y[max_s];
int n1=m-l+1;
int n2=r-m;
for(i=0;i<n1;i++)
x[i]=a[l+i];
for(i=0;i<n2;i++)
y[i]=a[l+n1+i];
x[n1]=y[n2]=max_s;//作用很大。、、、老是忘记。。
for(k=l,i=0,j=0;k<=r;k++)
{
if(x[i]<=y[j])
a[k]=x[i++];
else
a[k]=y[j++];
}
}
void Merge_sort(int a[],int l,int r)
{
if(l<r)
{
int m=(l+r)>>1;
Merge_sort(a,l,m);
Merge_sort(a,m+1,r);
Merge(a,l,m,r);
}
}
int main()
{
freopen("d.txt","r",stdin);
int n,i;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
Merge_sort(a,0,n-1);
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("%d\n",a[n-1]);
return 0;
}
堆排序:
#include <iostream>
#include <cstdio>
#define max_s 100007
using namespace std;
int a[max_s];
void head_adjust(int x,int n)
{
int i,j,tmp;
i=x;
j=i<<1;
tmp=a[x];
while(j<=n)
{
while(j<n&&a[j]>a[j+1]) j++;
if(tmp>a[j])
{
a[i]=a[j];
i=j;
j=2*j;
}
else
break;
}
a[i]=tmp;
}
int main()
{
freopen("d.txt","r",stdin);
int n,i;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=n/2;i>=0;i--)//zhuyi
head_adjust(i,n);
while(n--)
{
printf("%d ",a[1]);
a[1]=a[n+1];
head_adjust(1,n);
}
return 0;
}
地址: http://hi.baidu.com/gbaoxing10/item/b00796c864c9c9c2964452ed?qq-pf-to=pcqq.c2c