汉诺塔问题/快速排序/归并排序/ 二分查找(返回查找元素的位置)/线性时间选择:寻找一个序列中第k小元素/棋盘覆盖/循环赛日程表

汉诺塔问题

#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值