pat 09-排序1. 排序(25)
突然发现堆排序不会了
//25ms,stl自带,干过他真难
#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
int a[100000+5],i,n;
while(~scanf("%d",&n))
{
for(i=0;i<n;i++) scanf("%d",&a[i]);
sort(a,a+n);
for(i=0;i<n-1;i++)
printf("%d ",a[i]);
printf("%d\n",a[n-1]);
}
return 0;
}
//31ms,原始希尔排序
#include<stdio.h>
void Shell_sort(int A[],int N)
{
int i;
for(int D=N/2;D>0;D/=2)//希尔增量
{
for(int P=D;P<N;P++)
{
int Tmp=A[P];
for(i=P;i>=D&&A[i-D]>Tmp;i-=D)
A[i]=A[i-D];
A[i]=Tmp;
}
}
}
int main()
{
int a[100000+5],n,i;
while(~scanf("%d",&n))
{
for(i=0;i<n;i++) scanf("%d",&a[i]);
Shell_sort(a,n);
for(i=0;i<n-1;i++)
printf("%d ",a[i]);
printf("%d\n",a[n-1]);
}
return 0;
}
//测试6超时,1637ms,插入排序,效果比冒泡好
#include<stdio.h>
void Insertion_sort(int a[],int n)
{
int i;
for(int p=1;p<n;p++)
{
int tmp=a[p];
for(i=p;i>0&&a[i-1]>tmp;i--)
a[i]=a[i-1];
a[i]=tmp;
}
}
int main()
{
int a[100000+5],n,i;
while(~scanf("%d",&n))
{
for(i=0;i<n;i++) scanf("%d",&a[i]);
Insertion_sort(a,n);
for(i=0;i<n-1;i++)
printf("%d ",a[i]);
printf("%d\n",a[n-1]);
}
return 0;
}
//测试4、6、8超时,冒泡
#include<stdio.h>
#include<algorithm>
using namespace std;
void Bubble_sort(int a[],int n)
{
for(int p=n-1;p>=0;p--)
{
int flag=0;
for(int i=0;i<p;i++)
{
if(a[i]>a[i+1])
{
swap(a[i],a[i+1]);
flag=1;
}
}
if(flag==0) break;
}
}
int main()
{
int a[100000+5],n,i;
while(~scanf("%d",&n))
{
for(i=0;i<n;i++) scanf("%d",&a[i]);
Bubble_sort(a,n);
for(i=0;i<n-1;i++)
printf("%d ",a[i]);
printf("%d\n",a[n-1]);
}
return 0;
}
//31ms,希尔排序,Hibbard增量
#include<stdio.h>
int b[20];
int intt()
{
int i;
b[0]=1;
for(i=1;i<=20;i++)
{
b[i]=2*b[i-1];
//printf("%d\n",b[i]);
}
}
void Shell_sort(int A[],int N)
{
int i,k;
for(i=20;i>=0;i--)
if(b[i]<N) break;
k=i;
for(int D=b[k]-1;D>0;D=b[k]-1)//希尔增量
{
//printf("%d\n",D);
for(int P=D;P<N;P++)
{
int Tmp=A[P];
for(i=P;i>=D&&A[i-D]>Tmp;i-=D)
A[i]=A[i-D];
A[i]=Tmp;
}
k--;
}
}
int main()
{
int a[100000+5],n,i;
intt();
while(~scanf("%d",&n))
{
for(i=0;i<n;i++) scanf("%d",&a[i]);
Shell_sort(a,n);
for(i=0;i<n-1;i++)
printf("%d ",a[i]);
printf("%d\n",a[n-1]);
}
return 0;
}
//27ms,希尔排序Sedgewick排序
#include<stdio.h>
#include<math.h>
int b[20];
int intt()
{
int i;
b[1]=1;
for(i=2;i<=9;i++)
{
b[i]=pow(4.0,i*1.0)-3*(pow(2.0,i*1.0))+1;
//printf("%d\n",b[i]);
}
}
void Shell_sort(int A[],int N)
{
int i,k;
for(i=9;i>=0;i--)
if(b[i]<N) break;
k=i;
for(int D=b[k];D>0;D=b[k])//希尔增量
{
//printf("%d\n",D);
for(int P=D;P<N;P++)
{
int Tmp=A[P];
for(i=P;i>=D&&A[i-D]>Tmp;i-=D)
A[i]=A[i-D];
A[i]=Tmp;
}
k--;
}
}
int main()
{
int a[100000+5],n,i;
intt();
while(~scanf("%d",&n))
{
for(i=0;i<n;i++) scanf("%d",&a[i]);
Shell_sort(a,n);
for(i=0;i<n-1;i++)
printf("%d ",a[i]);
printf("%d\n",a[n-1]);
}
return 0;
}
//并归递归形式
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
const int inf=1<<30;
const int N=100000+5;
void Merge(int a[],int tmpa[],int l,int r,int rightend)
{
int leftend=r-1;
int tmp=l;
int numint=rightend-l+1;
while(l<=leftend&&r<=rightend)
{
if(a[l]<=a[r]) tmpa[tmp++]=a[l++];
else tmpa[tmp++]=a[r++];
}
while(l<=leftend)
tmpa[tmp++]=a[l++];
while(r<=rightend)
tmpa[tmp++]=a[r++];
for(int i=0;i<numint;i++,rightend--)
a[rightend]=tmpa[rightend];
}
//分治
void Msort(int a[],int tmpa[],int l,int rightend)
{
int center;
if(l<rightend)
{
center=(l+rightend)/2;
Msort(a,tmpa,l,center);
Msort(a,tmpa,center+1,rightend);
Merge(a,tmpa,l,center+1,rightend);
}
}
//统一函数接口
void Merge_sort(int a[],int n)
{
int tmpa[N];
Msort(a,tmpa,0,n-1);
}
int main()
{
int a[100000+5],n,i;
while(~scanf("%d",&n))
{
for(i=0;i<n;i++) scanf("%d",&a[i]);
Merge_sort(a,n);
for(i=0;i<n-1;i++)
printf("%d ",a[i]);
printf("%d\n",a[n-1]);
}
return 0;
}
/*
测试点 结果 用时(ms) 内存(kB) 得分/满分
0 答案正确 1 312 1/1
1 答案正确 1 184 10/10
2 答案正确 1 312 2/2
3 答案正确 4 312 2/2
4 答案正确 29 1592 2/2
5 答案正确 23 1592 2/2
6 答案正确 23 1592 2/2
7 答案正确 23 1664 2/2
8 答案正确 26 1336 2/2
*/
//并归,非递归形式
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
const int inf=1<<30;
const int N=100000+5;
void Merge1(int a[],int tmpa[],int l,int r,int rightend)
{
int leftend=r-1;
int tmp=l;
int numint=rightend-l+1;
while(l<=leftend&&r<=rightend)
{
if(a[l]<=a[r]) tmpa[tmp++]=a[l++];
else tmpa[tmp++]=a[r++];
}
while(l<=leftend)
tmpa[tmp++]=a[l++];
while(r<=rightend)
tmpa[tmp++]=a[r++];
for(int i=0;i<numint;i++,rightend--)
a[rightend]=tmpa[rightend];
}
void Merge_pass(int a[],int tmpa[],int n,int length)
{
int i,j;
for(i=0;i<=n-2*length;i+=2*length)
Merge1(a,tmpa,i,i+length,i+2*length-1);
if(i+length<n)
Merge1(a,tmpa,i,i+length,n-1);
else
for(j=i;j<n;j++) tmpa[j]=a[j];
}
void Merge_sort(int a[],int n)
{
int tmpa[N];
int length=1;
while(length<n)
{
Merge_pass(a,tmpa,n,length);
length*=2;
Merge_pass(tmpa,a,n,length);
length*=2;
}
}
int main()
{
int a[100000+5],n,i;
while(~scanf("%d",&n))
{
for(i=0;i<n;i++) scanf("%d",&a[i]);
Merge_sort(a,n);
for(i=0;i<n-1;i++)
printf("%d ",a[i]);
printf("%d\n",a[n-1]);
}
return 0;
}
/*
测试点 结果 用时(ms) 内存(kB) 得分/满分
0 答案正确 1 236 1/1
1 答案正确 1 256 10/10
2 答案正确 1 360 2/2
3 答案正确 4 360 2/2
4 答案正确 29 1564 2/2
5 答案正确 22 1640 2/2
6 答案正确 22 1640 2/2
7 答案正确 22 1536 2/2
8 答案正确 26 1384 2/2
*/
版权声明:本文为博主原创文章,未经博主允许不得转载。http://xiang578.top/