算法设计与分析之二 蛮力法
目录
1.蛮力法的设计思想
2.蛮力法优点
3. 冒泡排序分析
4. 选择排序分析
5. 蛮力法中冒泡排序与选择排序的时间空间复杂度分析
6. 蛮力法C语言实现
7. 算法稳定性的问题
8. 百钱买百鸡的问题
9. 补充:鸡尾酒排序法
10.蛮力法的思考
作为算法设计技术中最简单的一种设计策略,蛮力法从最先开始接触编程语言时就一直伴随着我们。
1. 蛮力法的设计思想
课本上的定义:蛮力法是指一种简单直接
1.蛮力法又称为枚举法,穷举法,暴力法。
2.蛮力法是指采用遍历(扫描)技术,即采用一定的策略将待求解问题的所有元素依次处理一次,从而找出问题的解。依次处理所有元素是蛮力法的关键,为了避免陷入重复试探,应保证处理过的元素不再被处理。
蛮力法解决问题的方法
根据问题中的条件将可能的情况一一列举出来,逐一尝试从中找出满足问题条件的解。但有时一一列举出的情况数目很大,如果超过了我们所能忍受的范围,则需要进一步考虑,排除一些明显不合理的情况,尽可能减少问题可能解的列举数目。
蛮力法解决问题的算法设计:
1)找出枚举范围:分析问题所涉及的各种情况。
2)找出约束条件:分析问题的解需要满足的条件,并用逻辑表达式表示。
2.蛮力法优点
- 逻辑清晰,编写程序简洁
- 对于一些重要的问题(比如:排序、查找、矩阵乘法和字符串匹配),可以产生一些合理的算法
- 解决问题的实例很少时,可以花费较少的代价
- 可以解决一些小规模的问题(使用优化的算法没有必要,而且某些优化算法本身较复杂)
- 可以作为其他高效算法的衡量标准
3. 冒泡排序分析(稳定性排序方法)
第i趟排序对序列的前n-i+1个元素从第一个元素开始依次作如下操作:相邻的两个元素比较大小,若前者大于后者,则两个元素交换位置,否则不交换位置。该n-i+1个元素中最大值元素移到该n-i+1个元素的最后。冒泡排序方法比较适合于参加排序的序列的原始状态基本有序的情况。
4. 选择排序分析(非稳定性排序方法)
选择排序开始的时候,扫描整个序列,找到整个序列的最小记录和序列中的第一个记录交换,从而将最小记录放到它在有序区的最终位置上,然后再从第二个记录开始扫描序列,找到n-1个序列中的最小记录,再和第二个记录交换位置。一般地,第i趟排序从第i个记录开始扫描序列,在n-i+1(1≤i≤n-1)个记录中找到关键码最小的记录,并和第i个记录交换作为有序序列的第i个记录。
每一趟排序从序列中未排序的元素中选择一个值最小的元素,将其置于没有排好序的元素的最前面。已排好序的元素不必交换。
5. 蛮力法中冒泡排序与选择排序的时间空间复杂度分析
1.选择排序:
平均时间复杂度o(n^2 )
最好时间复杂度o(n^2 )
最坏时间复杂度o(n^2 )
空间复杂度o(1)
2.冒泡排序:
平均时间复杂度o(n^2 )
最好时间复杂度o(n)
最坏时间复杂度o(n^2 )
空间复杂度o(1)
6.1蛮力法中冒泡排序C语言实现
#include <stdio.h>
void maopaopaixu(int s[],int n);
void main()
{
int s[20];
int i;
int n;
printf("请输入要输入的个数:");
scanf("%d",&n);
printf("请输入要排序的序列:\n");
for (i = 0; i < n; i++)
{
scanf("%d",&s[i