汉诺塔问题
#include <stdio.h>
void move(int n,int a,int b,int c)
if(n==1)
printf("%d——>%d\n",a,c);
else
{
move(n-1,a,c,b);
printf("%d——>%d\n",a,c);
move(n-1,b,a,c);
}
}
int main()
{
int n;
scanf("%d",&n);
move(n,a,b,c);
return 0;
}
快速排序
#include <stdio.h>
int a[100],n;
void quicksort(int left,int right)
{
if(left>right)
return 0;//一定要有这两行代码
int i,j,temp,t;
temp=a[left];
i=left;
j=right;
while(i!=j)
{
while(j>i&&a[j]>=temp)
{
j--;
}
while(j>i&&a[i]<=temp)
{
i++;
}
if(i<j)
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
a[left]=a[i];
a[i]=temp;
quicksort(left,i-1);
quicksort(i+1,right);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
quicksort(1,n);
for(int i=1;i<=n;i++)
{
printf("%d ",a[i]);
}
return 0;
}
归并排序(采用递归)
#include<stdio.h>
void merge(int a[],int left,int mid,int right)//对排序好的两对数字再进行排序
{
int i=left;
int j=mid+1;
int tp[101];
int k=0;
while(i<=mid&&j<=right)
{
if(a[i]<=a[j])
{
tp[k++]=a[i++];
}
else
{
tp[k++]=a[j++];
}
}
if(j==right+1)
{
while(i<=mid)
{
tp[k++]=a[i++];
}
}
if(i==mid+1)
{
while(j<=right)
{
tp[k++]=a[j++];
}
}
for(j=0,i=left;j<k;i++,j++)
{
a[i]=tp[j];
}
}
void mergesort(int a[],int left,int right)//进行不断分割至只含有两个数字之间的比较
{
if(left>=right)
return ;
int mid=(left+right)/2;
mergesort(a,left,mid);
mergesort(a,mid+1,right);
merge(a,left,mid,right);
}
int main()
{
int n;
int a[101];
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
mergesort(a,0,n-1);
for(int i=0;i<n;i++)
{
printf("%d ",a[i]);
}
return 0;
}
mid一定要在mergesort函数里面定义,且在merge函数定义里要有;
二分查找(返回查找元素的位置)
#include<stdio.h>
int Binsearch(int a[],int left,int right,int k)
{
int mid;
if(left<=right)
{
mid=(left+right)/2;//一定不要忘写mid的定义值
if(a[mid]==k)
return mid;
else
{
if(a[mid]>k)
{
return Binsearch(a,left,mid-1,k);
}
if(a[mid]<k)
{
return Binsearch(a,mid+1,right,k);
}
}
}
else
return -1;
}
int main()
{
int n;
int a[101];
int k;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
scanf("%d",&k);
int t=Binsearch(a,1,n,k);
if(t!=-1)
printf("Yes");
else
printf("No");//如果要求输出能找到元素 ,输出yes,else 输出no 加上这几行代码;
printf("%d",t);
return 0;
}
线性时间选择:寻找一个序列中第k小元素
方法一:利用快排或者各种排序方法,排成递增的数列,寻找序列中第k小元素,即a[k-1];
其他方法暂不掌握
循环赛日程表
#include<stdio.h>
int a[101][101];
void print(int n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}
}
void Gametable(int p,int q,int n)
{
//递归左上角与右上角
if(n>=4)
{
Gametable(p,q,n/2);
Gametable(p,q+n/2,n/2);
}
//填左下角
for(int i=p+n/2;i<p+n;i++)
{
for(int j=q;j<q+n/2;j++)
{
a[i][j]=a[i-n/2][j+n/2];
}
}
//填右下角
for(int i=p+n/2;i<n+p;i++)
{
for(int j=q+n/2;j<n+q;j++)
{
a[i][j]=a[i-n/2][j-n/2];
}
}
}
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(i==0)
a[i][j]=j+1;
else
a[i][j]=0;
}
}
Gametable(0,0,n);
print(n);
return 0;
}