经典排序算法
来源:互联网 发布:编写windows应用程序 编辑:程序博客网 时间:2024/05/21 06:48
数值算法:解方程、微积分、数值分析 多用在工程设计
非数值算法:搜索、排序、拆分、合并 多用在系统
一、线性搜索
1.算法
1.1从头开始,依次将每一个元素与查找目标进行比较
1.2或者找到目标,或者找不到目标
2.评估
2.1平均时间复杂度:O(N),线性时间
2.2对数据没有任何规律性要求 穷举法
二、二分搜索(折半搜索)
1.算法
1.1假设表中的元素按升序排列
1.2若中间元素与查找目标相等,则查找成功,否则利用中间元素将表划分为前后两个子表
1.3若查找目标小于中间元素,则在前子表中继续查找,否则在后子表中继续查找
1.4重复以上过程,直到查找成功,或者因子表不存在,而宣告失败
2.评估
2.1平均时间复杂度:O(logN)
2.2限制:对数据有有序性要求
三、冒泡排序
两两比较,大的靠后排(向上冒泡),每趟冒一个
对N个元素,需要扫描N-1趟,第i趟做N-1-i次比较
1.算法
1.1对相邻元素做两两比较,前者大于后者,彼此交换;
1.2从第一对到最后一对,最大的元素沉降到最后;
1.3针对未排序部分,重复以上步骤,沉降次大元素;
1.4每次扫描越来越少的元素,直至不在发生交换
2.评估
2.1平均时间复杂度:O(N^2)
2.2是稳定排序(排序前后等值元素的数序不变)
2.3对数据的有序性敏感 如果排序接近有序,则排序非常快,且代码复杂度低
四 插入排序
1.算法
1.1首元素自然有序;
1.2取出下一个元素,对已排序序列,从后向前扫描;
1.3大于被取出元素者后移;
1.4小于被取出元素者,将被取出元素插入其后;
1.5重复2,直到2处理完所有元素
2.评估
2.平均时间复杂度:O(N^2)
2.2稳定排序、
2.3对数据的有序性非常敏感、
2.4不交换,只是移动,优于冒泡
五 选择排序
1.算法
1.1在整个序列中寻找最小元素,与首元素交换、
1.2在剩余序列中寻找最小元素,与剩余序列的首元素交换
1.3直到剩余序列中仅盛一个元素为止
2.评估
2.1不稳定排序 值相同的元素,前后顺序会发生变化
2.2平均时间复杂度 O(N^2)
2.3对数据的有序性不敏感
2.4交换次数少,优于冒泡排序
六 快速排序
1.算法
1.1从待排序序列中任意挑选一个元素,作为基准;
1.2将所有小于基准的元素放在基准之前,大于基准的元素放在基准之后,等于基准的元素放在基准之前或之后,这个过程称为分组;
1.3以递归的方式,分别对基准之前和基准之后的分组继续进行分组,知道每个分组内的元素个数不多于1个
2.评估
2.1平均时间复杂度:O(NlogN)线性增长
2.1非稳定排序
2.3如果每次都能均匀分组,速度达到极值
通常选择中间位置作为基准,产生均匀分组的几率最高
q_sort原型
void qsort(void* base, //数组首地址
size_t nmemb, //数组元素个数
size_t size, //数组元素字节数
int (*compar)(const void*,const void*) //比较函数
);
七、归并排序
平均时间复杂度:O(2NlogN)
稳定排序。
对数据的有序性不敏感。
非就地排序。需要额外的内存空间。
- 经典排序算法
- 【经典算法】快速排序
- 【经典算法】堆排序
- 经典排序算法集合
- zz 经典排序算法
- JAVA经典排序算法
- 冒泡---经典排序算法
- 经典排序算法
- 常见经典排序算法
- 经典排序算法
- 经典算法:快速排序
- 经典排序算法
- 经典算法---冒泡排序
- 常见经典排序算法
- [经典排序算法][集锦]
- [经典排序算法][集锦]
- 经典排序算法
- [经典排序算法][集锦]
- NEFU 654记忆化搜索
- iOS提交后申请加急审核
- 各种图片播放器 焦点图 旋转幻灯片 四屏切换 相册代码
- Virgo与Maven整合开发环境搭建(四)
- MYSQL获取更新行的主键ID
- 经典排序算法
- ios后台机制
- C# object 转 int
- iOS7 UI改变总结
- HBase集群出现NotServingRegionException问题的排查及解决方法
- 指针问题,设置CCmenuitem为enable(false),还会触发其回调函数
- linux shell 语法
- 自定义Adapter实现多种Item视图的ListView
- 【BZOJ】【P3295】【CQOI2011】【动态逆序对】【题解】【树套树】