计算机复试练习题:排序一

一:题外话

今天是2016年6月13日,我准备开始练习计算机机试题了,作为一个普通一本,没过六级,但还是想去北京读书的普通大学生,我还是选择努力的挣扎一下。(虽然感觉有夏令营资格的可能性都不算大)。于是买了一本王道论坛出的《计算机考研机试指南》,最近才知道9度OJ凉凉了,对此表示真的是巨可惜,不过书还是好书,因此我将以这本书来进行准备。

回想我大学的编程之路,自从大一申请参加学校的acm实验室失败之后,我对算法编程题便有了一种恐惧,感觉自己没有那些能进实验室的人聪明。其实事实的确如此,身边不乏有许多在编程上有天分的同学存在,他们就有那种对解题方法敏锐的嗅觉。不过我也相信事在人为,我不追求变成一个acmer,但是也应该好好努力,掌握基础的知识,至少如果有机会参加夏令营,我希望我可以取点分。。。

二:正式开始:排序

1,冒泡排序:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n;
    int buf[100];
    int i=0,j=0;
    while(scanf("%d", &n) != EOF)
    {
        for (i=0; i<n; i++)
        {
            scanf("%d", &buf[i]);
        }
        for(i=0; i<n; i++)
        {
            for(j=0; j<n-1-i; j++)
            {
                if(buf[j] > buf[j+1])
                {
                    int temp = buf[j];
                    buf[j] = buf[j+1];
                    buf[j+1] = temp;
                }
            }
        }
        for(i=0; i<n; i++)
        {
            printf("%d ", buf[i]);
        }
        printf("\n");
    }
}

1).好久没写过C的代码了,我只能说难受。这个是基础的入门程序,从这个程序中,要注意的就是读入数据的方式:

while(scanf("%d",&n)!=EOF)  回想大一的时候看见这个东西都要懵逼半天。

2).当输入的是字符串,并且读的方式使用得是gets()方式的时候,相同功能的循环判断语句改为while(gets(字符串变量))

3).冒泡排序的思想就是两两交换,每一轮都将最大的交换到后面。因此两个循环的条件就很好理解了。

4).要注意算法的复杂度问题,冒泡排序的复杂度是O(N^2),因此比如n的范围是10000的时候,就不能使用冒泡排序了。

2.C++写好的排序函数:

扫描二维码关注公众号,回复: 1763251 查看本文章
#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
    int n;
    int buf[10000];
    while(scanf("%d", &n)!=EOF)
    {
        for(int i=0; i<n; i++)
        {
            scanf("%d", &buf[i]);
        }
        sort(buf, buf+n);//使用了sort的一个重载函数
        for(int i=0; i<n; i++)
        {
            printf("%d ", buf[i]);
        }
        printf("\n");
    }
}

1).头文件要包含<algorithm>。 注意这里还是使用的<stdio.h>头文件,这样可以使用scanf读入。

2)sort函数的两个参数表示排序数组的起始地址和终止地址。默认是升序排序。

3.C++ sort函数的重载(实现降序)

#include<stdio.h>
#include<algorithm>
using namespace std;
bool cmp(int x, int y)
{
    return x>y;
}
int main()
{
    int n;
    int buf[10000];
    while(scanf("%d", &n)!=EOF)
    {
        for(int i=0; i<n; i++)
        {
            scanf("%d", &buf[i]);
        }
        sort(buf, buf+n, cmp);//使用了sort的一个重载函数
        for(int i=0; i<n; i++)
        {
            printf("%d ", buf[i]);
        }
        printf("\n");
    }
}

可以看到这里只是定义了一个bool类型的cmp函数,只是规定了里面排序规则。这里大于是降序。

4.c语言qsort函数:

c语言也有快排函数,qsort。

#include <stdio.h>
#include <stdlib.h>
//整型升序排序
int cmpInt(const void*a, const void*b)
{
    return *(int *)a - *(int *)b;
}
//整型降序排序
int cmpInt1(const void*a, const void*b)
{
    return *(int *)b - *(int *)a;
}
//
int main()
{
    int n;
    int buf[100];
    int i=0,j=0;
    while(scanf("%d", &n) != EOF)
    {
        for (i=0; i<n; i++)
        {
            scanf("%d", &buf[i]);
        }
        qsort(buf, n, sizeof(buf[0]), cmpInt1);
        for(i=0; i<n; i++)
        {
            printf("%d ", buf[i]);
        }
        printf("\n");
    }
}

可以看出qsort使用方法于sort有相似地方,都需要自定义一个比较函数。关于qsort,还可以比较字符串数组和结构体数组,可以参考这篇博客:https://blog.csdn.net/stpeace/article/details/9017113



猜你喜欢

转载自blog.csdn.net/xckkcxxck/article/details/80684160
今日推荐