c++ map 排序_21川大计算机考研 | 你的排序模板来啦!赶紧收藏~

739d82a3efe36d72bd6610b8a8c70237.png

文 彦 考 研

让 | 梦想 | 有迹可循

老师简介

c589e946b508601f7bbf49a804ba4161.png

零师姐:2017年以初试分数350+、复试第2的成绩考入四川大学计算机学院计算机科学与技术专业。

现于文彦考研担任专业课导师,辅导川大874计算机综合考研笔试、复试。多次参与与IT公司的合作项目当中,熟悉计算机专业的考研动态与就业形势。

这是川大计算机考研第 20 篇文章

21届考研已经提上日程啦!很多同学对于专业课的重点都是靠自己去摸索和总结,今天师姐就直接给大家划重点。这篇文章主要是数据结构大题,我会给大家指明这部分必须掌握的点,一起来看吧!

排序(归并排序、快速排序、冒泡排序)

归并排序模板

#include

#include

#include

#include

#include

#include

#include

#include

#define LL long long

#define inf 0x3f3f3f3f

#define mod 1e9+7

const int maxn=1e5+5;

using namespace std;

int temp[maxn];

int num=0;///统计逆序对数的。

void Merge(int a[],int left ,int mid,int right)

{

    int i=left,j=mid+1,n=0,length=right-left;///i开始为左半部分最左边,j为右半部分最左边。temp数组是从下标0开始存数。

    while(i<=mid&&j<=right){

        if(a[i]>a[j]){///左边比右边大。

            temp[n++]=a[j++];

            num+=mid-i+1;///从i到mid都是比a[j]大。

        }

        else{

            temp[n++]=a[i++];

        }

    }

    if(i>mid){///这里说明的是左边全部填满了(因为前面的判断条件是i<=mid,那就是填右边了。

        while(j<=right){

            temp[n++]=a[j++];

        }

    }

    else{

        while(i<=mid){

            temp[n++]=a[i++];

        }

    }

    for(int k=0;k<=length;k++){///最后赋值到原数组必须要有的。

        a[left+k]=temp[k];

    }

}

void mergesort(int a[],int left,int right)

{

    if(left

        int mid=(left+right)/2;

        mergesort(a,left,mid);

        mergesort(a,mid+1,right);

        Merge(a,left,mid,right);

    }

}

int main()

{

    int number[30] = {23,3,26,24,5,1,12,21,29,15,17,10,7,22,6,20,19,11,2,4,9,25,13,27,14,18,28,8,16,30};

    mergesort(number,0,30-1);///初始化调用也要注意额。

    for(int i=0;i<30;i++){

        printf("%d ",number[i]);

    }

}

快速排序模板

1

#include

#include

#include

#include

#include

#include

#include

#include

#define LL long long

#define inf 0x3f3f3f3f

#define mod 1e9+7

#include

using namespace std;

int Partition(int a[], int left, int right)///7行代码

{

        int i = left-1;///初始化一定要赋值好。

        for(int j=left;j<=right-1;j++){

                if(a[j] < a[right]){///把right这个作为轴了。

                        i++;///这个i坐标左边的值就是比a[right]小的。

                        swap(a[i], a[j]);///必须交换一下。

                }

        }

        swap(a[i+1], a[right]);///最后把i+1和right交换,这样轴就是i+1了必须是保证i+1上当初就是作为标杆的a[right]啊。

        return i+1;

}

void Qsort(int a[], int left, int right)

{

        if(left

              int q = Partition(a, left, right);

              Qsort(a, left, q-1);

              Qsort(a, q+1, right);

        }

}

int main()

{

    Int number[30] = {23,3,26,24,5,1,12,21,29,15,17,10,7,22,6,20,19,11,2,4,9,25,13,27,14,18,28,8,16,30};

    Qsort(number,0,30-1);///c初始化调用也要注意额。

    for(int i=0;i<30;i++){

        printf("%d ",number[i]);

    }

}

2

2、题目大意是,N个村庄,给你N个村庄修路的代价,问使得N个村庄联通的最小代价。

示例输入:

3

0 990 692

990 0 179

692 179 0

示例输出:

692

最小生成树两个解法prime和kruskal,一个从点出发,一个从最短的边出发,根据实际情况来定。

示例代码:

#include
#define MAX 65537
int i,j,n,u,T,max,tp,map[501][501],d[501];
bool s[501];
void Prim()
{
    for(i=1;i<=n;i++)
    {
        d[i]=map[1][i];
        s[i]=false;
    }
    s[1]=true;
    for(j=1;j<=n;j++)
    {
        tp=MAX,u=1;
        for(i=1;i<=n;i++)
        {
            if(!s[i]&&d[i]                tp=d[i],u=i;
        }
        s[u]=true;
        for(i=1;i<=n;i++)
        {
            if(!s[i]&&map[u][i]                d[i]=map[u][i];
        }
    }
}
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
            scanf("%d",&map[i][j]);
        Prim();
        for(i=1,max=0;i<=n;i++)
            if(d[i]>max)max=d[i];
        printf("%d\n",max);
    }
    return 0;
}

3

3、二分 模版

int binary_search(int *array, int length, int key) {

int start = 0, end = length - 1;

while(end >= start) {

int middle = start + (end - start) / 2;

int tmp = array[middle];

if(tmp < key) start = middle + 1;

else if (tmp > key) end = middle - 1;

else return middle;

}

return -1;

}

4

4、大写转换为小写

题意为:读入一些字符串,将其中的小写字母转成大写字母(其他字符不变)。

输入示例

Hello

ICPC2004

12345abcde

输出示例

HELLO

ICPC2004

12345ABCDE

示例代码:

#include

#include

int main ()

{

    int ch;

    while((ch=getchar( )) !=EOF)

    {

        if(ch>='a'&& ch<='z')

        {

            putchar(ch-'a'+'A');

        }

        else

        {

            putchar(ch);

        }

    }

}

5

5、去掉空格

题意为:读入一些字符串,将其中的空格去掉。

输入示例

Hello World

1 2 3

Nice to meet you

abc

输出示例

HelloWorld

123

Nicetomeetyou

abc

示例代码:

#include

void fun(char *str)

{

   int i,j;

   for(i=0,j=0;str[i]!='\0';i++)

   {

    if(str[i]!=' ')

    {

        str[j]=str[i];

        j++;

    }

   }

   str[j]='\0';

}

int main(void)

{

  char str1[81];

  while(gets(str1)!=NULL)

  {

      fun(str1);

      puts(str1);

  }

}

今天的分享就先到这里啦

如果你还对考研有什么疑惑

欢迎添加小彦微信或入群

与老师一对一咨询

9f8f1e26ca9b19d8518da4095d4a7022.png 推荐阅读

20川大计算机考研 | 你非常容易混淆的几个点!

20川大计算机考研 | 考点总结,复习更高效!

20届川大计算机 | 不为人知的取分妙招,赶紧get吧!

20川大计算机 | 制胜第一步!师姐已经帮你整理好了!

20川大计算机考研 | 弄清这些问题,考研不是难事!

20川大计算机 | 时间复杂度,你避不开的一个考点!

20川大计算机考研 | 想拿高分?你要的题目都在这!

fb8677e2679f882cd1e894e13de2e788.gif 扫码入群 获取更多干货

69cfbd3aaf989552da3e17158b01389a.png

加小彦微信

 一对一咨询~

e91dab95ef4319978a100bf3a3147fad.png

官网/微博:文彦考研

5375d51f2fe90dd9ae318450f593ce56.png

注:图片来源于网络,版权归原作者所有,侵删。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值