王道机试指南NO.1排序&1s运行时限的时间复杂度分析

题目描述

对输入的n(1<=n<=100)个数进行排序并输出
时间限制 1s;内存限制 32MB

样例输入

4
1 4 3 2

样例输出

1 2 3 4
(每个数后面都有一个空格)

题目分析----使用冒泡

对于1s的运行时限,设计的算法复杂度不能超过百万级别,即不能超过一千万。–>如果算法时间复杂度为O(n2),则n应不大于3000。因此,要对写的程序在最坏情况下的复杂度进行估算,假如确定其在百万数量级之内,那程序一般不会超过规定时限。
本题中,n最大为100,冒泡排序复杂度为O(n2),n2仅在万级;且冒泡空间复杂度为O(n),大致需要100*32bit的内存,也不会超过32MB。故可以使用冒泡排序实现。

C++实现(冒泡)

#include 

using namespace std;

int main(){
    int n;
    int buf[100];
    while(cin >> n){
        for(int i = 0; i < n; i++){
            cin >> buf[i];
        }//输入待排数字

        for(int i = 0; i < n; i++){
            for(int j = 0; j < n-1-i; j++){
                if(buf[j] > buf[j+1]){
                    int tmp = buf[j];
                    buf[j] = buf[j+1];
                    buf[j+1] = tmp;
                }
            }
        }//冒泡排序
        for(int i = 0; i < n; i++){
            cout << buf[i] << " ";
        }
        cout << endl;
    }
    return 0;
}

运行结果

王道机试指南NO.1排序&1s运行时限的时间复杂度分析_第1张图片
【注】1、若用C实现,while的控制条件改为while(scanf("%d", &buf[i]) != EOF)
scanf函数是用返回值的,返回被输入函数成功赋值的变量个数。本例中,若成功完成输入并对n赋值,scanf的返回值为1。EOF = -1。如果输入已经到达结尾,scanf函数无法在为变量n赋值,于是scanf函数返回EOF(End of file),循环体条件不成立,跳过循环体,执行return 0,程序正常结束。这个循环条件既保证可对多组测试数据进行计算,又能使程序在输入结束后正常退出。
2、若输入为字符串,采用gets()方法读入,则相同功能的循环判断语句为while(gets(字符串变量))。

题目分析----使用快排

  1. 若将n的范围最大改为10000,若用冒泡(10000*10000)超过百万级,则要使用快排、归并等更优复杂度的排序算法。C++库中以为我们写好了快速排序的库函数,只需调用。sort库函数,在头文件algorithm中。sort(起始地址,结束地址)

  2. 若要实现降序排列,要定义一个cmp函数,来实现对新的排序规则的定义。当cmp的返回值为true数时,即表示cmp函数的第一个参数将会排在第二个参数之前。(第一个参数比第二个参数大,则排在前面)。调用sort函数的一种重载形式:sort(起始地址,结束地址,比较函数)。

C++实现(快排)

升序排列

#include 
#include 

using namespace std;

int main(){
    int n;
    int buf[100];
    while(cin >> n){
        for(int i = 0; i < n; i++){
            cin >> buf[i];
        }//输入待排数字

        sort( buf, buf+n);//快速排序
        for(int i = 0; i < n; i++){
            cout << buf[i] << " ";
        }
        cout << endl;
    }
    return 0;
}

运行结果

王道机试指南NO.1排序&1s运行时限的时间复杂度分析_第2张图片

降序排列

#include 
#include 

using namespace std;

bool cmp(int x, int y){
    return x > y;
} //比较函数

int main(){
    int n;
    int buf[100];
    while(cin >> n){
        for(int i = 0; i < n; i++){
            cin >> buf[i];
        }//输入待排数字

        sort( buf, buf+n, cmp);//快速排序
        for(int i = 0; i < n; i++){
            cout << buf[i] << " ";
        }
        cout << endl;
    }
    return 0;
}

运行结果

王道机试指南NO.1排序&1s运行时限的时间复杂度分析_第3张图片

总结

一定要用sort完成排序!

你可能感兴趣的:(王道机试)