小白的编程经验(算法)

一、算法是什么

数据结构中的算法,指的是数据结构所具备的功能。
解决特定问题的方法,它是前辈们的一些优秀的经验总结。

二、算法的五个特性

输入:具有0个或者多个输入
输出:至少有一个或者多个输出
有穷性:在有限步骤之后会自动结束而不会无限循环
确定性:每一步都有确定的含义,不会出现二义性
可行性:算法的每一步都是可行的

三、算法的时间复杂度

    时间复杂度:
        由于计算机的性能不同,无法准确地统计出某个算法执行所需要的时间,所有我们使用算法执行的次数来代表算法的时间复杂度
        O(频次) 
	常见的时间复杂度:
            //O(1)
            printf("%d",i);
            //O(logn)
            for(int i=n;i>=0;i/=2)
            {
                printf("%d",i);       
            }
            //O(n)
            for(int i=0;i<n;i++)
            {
                printf("%d",i);       
            }
            //O(nlogn)
            for(int i=0;i<n;i++)
            {
                for(int j=n;j>=0;j/=2)
                {
                    printf("%d",j);       
                }     
            }
            //O(n^2)
            for(int i=0;i<n;i++)
            {
                for(int j=0;j<n;j++)
                {
                    printf("%d",j);       
                }     
            }

四、查找算法

    顺序查找:
        对待查找的数据没有要求,从头到尾比较
        适合在小规模的数据中使用,效率低下
        时间复杂度:O(n)
    
    二分查找:
        待查找的数据必须有序,从数据中间的位置开始比较,如果中间值比key小,去右边找,反之去左边找。
        时间复杂度:O(logn)

    块查找(权重查找):
        是一种处理数据的思想,不是一种特定的算法,当数据量多的时候,可以先把数据分块处理,再根据块条件进行查找,如字典
    
    哈希查找:
        数据经过哈希函数计算出数据哈希表中的位置,然后标记,方便之后的查找,它的时间复杂度最好能到O(1)

五、排序算法

 排序算法的稳定性:
    在待排序的数组中,如果有值相同的数据,排序过程中如果无论如何都不会改变他们俩的前后顺序,则认为该排序是稳定的

注意:算法的时间复杂度并不能完全代表算法的实际执行时间,有时候看似复杂度高的算法反而运行速度快

冒泡排序:
    数据左右进行比较,把最大的数据交换到最后,特点是该算法对数据的有序性敏感,在排序过程中如果发现有序可以立即停止。
    如果待排序的数据基本有序时,冒泡排序的效率非常高
    时间复杂度:最优:O(n)  平均:O(n^2)
    稳定性:稳定
选择排序:
    假定最开始的位置是最小值并记录下标min,然后与后面的数据比较,如果有比min下标的数据小,则更新min,最后如果min改变
    则交换min为下标的数据与最开始位置的数据
    虽然时间复杂度还是O(n^2),但是特点是交换次数少,因此实际运行时间并不慢。
    是冒泡排序的一种变种,但是对数据的有序性不敏感,因此数据较混乱时比冒泡快。
    时间复杂度:O(n^2)
    稳定性:不稳定 
插入排序:
    把数据看成两部分,一部分有序的,把剩余部分的数据逐个插入进去,直到插完就全部有序了
    适合对已经排序号的数据,新增数据并重新排序
    时间复杂度:O(n^2)
    稳定性:稳定
希尔排序:
    是插入排序的升级版,由于插入排序时,数据移动的速度比较慢,所以增加了增量的概念,以此提高排序的速度。
    数据量越多,比插入的速度越快
快速排序:
    找到一个标杆,备份标杆的值,一面从左边找比标杆大的数据,然后把找到的数据赋给标杆位置,更新标杆位置到左标杆处,
    再从右边找比标杆值小的数据,如果找到也把数据赋值给标杆位置,更新标杆位置到右标杆处,重复以上步骤,直到左右标
    杆相遇,最后在相遇处还原标杆的值,最终达到标杆左右两边整体有序,然后按着同样的方法排序左右部分,最终全部有序。
    它的综合性能最高,因此叫做快速排序,笔试中考的比较多的排序算法
    时间复杂度:O(nlogn)
    稳定性:不稳定
归并排序:
    先把待排序的数据拆分成单独的个体,然后按照从小到大的顺序合并复制到临时内存中,最终全部合并结束后再从临时内存赋值给原内存
    由于需要使用额外的内存空间,因此避免数据交换的耗时,是一种典型的用空间换时间的算法
    时间复杂度:O(nlogn)
    稳定性:稳定
堆排序:
    把数据当作完全二叉树,然后把树调整成大顶堆,再把根节点的数据交换到最后。
    然后剩余部分重新调整为大顶堆,重复以上步骤,直到数量为1
    时间复杂度:O(nlogn)
    稳定性:不稳定
计数排序:
    先找出数据中的最大值、最小值,创建哈希表,用(最大值-最小值+1)作为哈希表的长度,使用数据-最小值作为哈希表的下标访问哈希表
    并标记+1,然后遍历哈希表,当表中的值非零时,把该(下标+最小值)还原回原来的数据依次放入原数组中,最终排序完成,是一种典型的
    用空间换时间的算法,该算法理论上速度可以非常快,但是有很大局限性,适合排序整型数据,而且数据的差值不宜太大,否则会非常浪费
    内存,适合数据较为平均,重复较多的排序
    时间复杂度:O(n+k)
    稳定性:稳定
桶排序:
    把数据根据值的范围,存储到不同范围的桶中,如果调用其他的排序算法,对桶中的数据进行排序,排序结束后再拷 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值