想学习了。。

今天早上接到阿里一个人的电话,当时正在上课,就跟他说下午3点半以后才有空。本以为下午4点左右那会儿会电面呢,一整个下午都不敢睡觉。翻看了参加美赛时的论文,准备了一下。结果一直没来电话!不过上网看面试题的过程中倒是发现了不少优秀的前辈的经验,顿时发现自己弱到不行啊!!大一大二干嘛去了啊。天天上课、为了考试考多几分熬夜复习,却很少熬夜写过代码。导致编程能力极弱。这是我这段时间反思我大学学习生涯以来最大的遗憾。私以为,学院为我们绘制的蓝图确实是很美好的,不过对于大多数像我这样一开始并没有太多的专业规划的本学院学生来说,很多人都是糊糊涂涂地度过了锻炼码力的大一大二黄金期。反倒为了保研或者其他什么,对考试的一分两分斤斤计较。当然考试还得看重,不过我后悔没有早点做专业规划,没有早点爱上计算机。不然现在又不一样了。

话说回来,还是想给自己一个好好提高的承诺,所以开通了第二个CSDN博客。不为别的,只为了纪念自己在编程道路上成长的点点滴滴。看到很多大神前辈们都有自己的一份成长记录,心里怪羡慕的。不过,那也是人家一个钟头一个钟头熬出来的结果。羡慕归羡慕,还得付诸行动。

晚上自习前去买了一本《编程之美》,稍微翻看了一下前面,发现还真是写得很有趣味,对思维的锻炼绝不是一点半点,自己的兴趣也提高了。不过对于自己接下来几个月的学习规划还是没有特别清晰,总体还是锻炼C/C++编程吧,毕竟是靠它吃饭的本事。这一个星期先把排序算法都亲自实现一遍,吃透每个算法。然后适当配以一些经典面试题进行运用。不知道这样的规划合不合理呢?希望路过的大神能给点指点吧!

顺便把今晚编的三个复杂度为o(n2)的排序算法贴出来。很简单,不过自己还是改了一个多小时才完全改对,很惭愧啊。


冒泡排序:


#include <iostream>

using namespace std;

#define MAX 10

int main()
{
    int a[MAX];
    int i, j, tmp;
    for(i = 0;i <= MAX - 1;i ++)
        cin >> a[i];
    for(i = 1;i <= MAX - 1;i ++)
        for(j = MAX - 1;j >= i;j --)
            if(a[j] < a[j - 1])
            {
                tmp = a[j - 1];
                a[j - 1] = a[j];
                a[j] = tmp;
            }
    for(i = 0;i < MAX;i ++)
        cout << "the " << i << " number is" << a[i] << endl;
    return 0;
}

插入排序:

#include <iostream>
#include <stdio.h>
using namespace std;

#define MAX 10

int main()
{
    int a[MAX];
    int i = 1, j, k, in, e;
    cin >> a[0];
    while(i < MAX)
    {
        cin >> in;
        for(j = 0;j < i;j ++)
            if(in > a[j]) ;
            else
            {
                e = 1;
                break;
            }
        if(e == 1)
            for(k = i;k > j - 1;k --)
                a[k] = a[k - 1];
        a[j] = in;
        i ++;
    }
    for(k = 0;k < MAX;k ++)
        cout << a[k] << endl;
    return 0;
}

这是鸣神改的,比较简练:

#include <iostream>
#include <stdio.h>
using namespace std;

#define MAX 10

int main()
{
    int a[MAX];
    int i = 1, j, k, in;
    cin >> a[0];
    while(i < MAX)
    {
        cin >> in;
        for(int f=0;f<i;f++) printf("%d ",a[f]);
        puts(" ");
        for(j = 0;j < i;j ++)
        {
            if(in < a[j])
            {
                for(k = i;k > j;k --)
                {
                    a[k] = a[k - 1];
                }
                a[j] = in;
                break;
            }
        }
        if(j==i) a[j]=in;
        i ++;
    }
    for(k = 0;k < MAX;k ++)
        cout << a[k] << endl;
    return 0;
}

书上的写法,明早再亲自实现完贴出来:


选择排序:


#include <iostream>
#include "swap.h"
using namespace std;

#define MAX 10

int main()
{
    int a[MAX];
    int i, j, min, k, tmp;
    for(i = 0;i < MAX;i ++)
        cin >> a[i];
    for(i = 0;i < MAX;i ++)
    {
        min = a[i];
        for(j = i;j < MAX;j ++)
        {
            if(a[j] < min)
            {
                swap(a[j],min);
            }
        }
        a[i] = min;
    }
    for(k = 0;k < MAX;k ++)
        cout << a[k] << endl;
    return 0;
}


swap.h,应该单独写出来并给每个排序引用的:

#ifndef SWAP_H_INCLUDED
#define SWAP_H_INCLUDED

void swap(int &x, int &y)
{
    int tmp;
    tmp = x;
    x = y;
    y = tmp;
    return;
}

#endif // SWAP_H_INCLUDED

上面三种算法的算法复杂度虽然都为O(n2),不过由于 调用swap()[当记录非常多的时候,调用函数所用时间非常可观!]次数不同,实际需要的时间也大不相同。冒泡和插入排序的平均调用次数为n2/4,而选择排序只需调用n-1次。

在实现中,如果记录较大,为了减少交换时间,可以用一个数组存放记录的指针,交换时只需交换记录指针的相对位置。排序的结果是使指针按记录不减的顺序排列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值