算法2

算法
一,为什么需要算法
1.很多问题人类的解决方法并不适合由机器完成,因此需要专门为机器设计一些特殊的方法,解决实际问题
2.计算方法
数值计算:微积分,解方程,统计和随机信号分析,等等
非数值计算:排序,搜索 ,调度,归并,拆分,优化,等等
3.学习目标
1)将一个实际问题变成机器可以解决的问题。
2)用程序设计语言来实现算法。
二,搜索算法
1.线性搜索
1)从头开始依次将每一个元素与我们的查找目标进行比较;
2)或者找到目标或者找不到目标。
评价:
1)平均时间复杂度:O(N)
2)对数据样本没有任何特殊要求,适用范围广泛
2.二分搜索(折半搜索)
在有序序列:10 20 30 40 50 60 70 80
中找50
1)算法
A.假设表中的元素按升序排列;
B.若中间元素与查找目标相等,则查找成功,否则利用中间元素将表划分为前后两个子表;
C.若查找目标小于中间元素,则在前子表中查找,否则在后子表中查找
D.重复以上过程,直到查找成功,或者因子表不存在而宣告失败。
2)评价
A.平均时间复杂度;O(logN)。
B.数据样本必须有序。
练习:
有如下数组
1,2,8,9,2,3,9,12,4,7,10,13,6,8,11,15
编写一个函数返回该数组中与参数匹配的元素下标。


三,排序算法
1.冒泡排序
30 20 50 40 10 
第一趟:20 30 40 10 50 
第二趟:20 30 10 40 50 
第三趟:20 10 30 40 50 
第四趟:10 20 30 40 50 
1)
A.相邻元素两两比较,前者大于后者,彼此交换
B.从第一对到最后一对,最大的元素沉降到最后
C)针对未排序的部分,重复以上步骤,沉降次大值
D)每次扫描越来越少
2)评价
A.平均时间复杂度:O(2^N)
B.稳定排序
C.对数据的有序性非常敏感
2.插入排序
1)算法
A.首元素自然有序
B.取出下一个元素,对已排序序列,从后向前扫描;
C.大于被取出元素者后移
D.小于等于被取出元素者,将被取出元素插入其后;
E.重复步骤B,直到处理完所有元素。


2)评价
A.平均时间复杂度:O(N^2)
B.稳定排序
C.对数据的有序性非常敏感
D.不交换而只是移动,优于冒泡排序


3.选择排序
1)算法
A在整个序列中寻找最小元素,与首元素交换
B在剩余序列中寻找最小元素,与次元素交换
C以此类推,直到剩余序列中仅包含一个元素
2)评价
A 平均时间复杂度;O(N^2)
B 不是稳定排序
C 对数据的有序性不敏感
D 交换次数少,优于冒泡排序
      
4.快速排序
1)算法
A 从带排序序列中任意挑选一个元素,作为基准
B 将所有小于基准的元素放在基准之前,大于基准的元素放在基准之后,等于基准的元素任意的放在基准之前或者之后,这个过程叫做分组
C 以递归的方式,分别对基准之前和基准之后的分组继续分组
直到每个分组内的元素个数不多于1个为止
2)评价
A 平均时间复杂度:O(NlogN)
B 非稳定排序(同值可能到最后)
C 若每次都能均匀分组,可以达到最快的排序速度
D 对数据的有序行不敏感
标准C函数(qsort), 泛型
void qsort(void *base,//数组首地址
size_t nmemb,//数组元素个数
size_t size,//数组元素的字节数
int (*compar)(const void*,const void*));//比较器函数指针
int intcmp(const void* a,const void* b){
return *(const int*)a-*(const int*)b;
}























































































































































  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值