算法的含义
算法是一系列解决问题的清晰指令,也就是说,对于符合一定规范的输入,能够在有限时间内获得所要求的输出 —摘自《算法设计与分析基础》
算法的时间复杂度
时间复杂度并不指算法运行所需要的时间,而是算法执行的次数。
一、蛮力法
1、冒泡排序
比较列表中相邻的元素,如果他们是逆序的话就交换他们的位置,重复多次以后,最终,最大的元素就到达了列表的最后一个位置,第二遍操作时将第二大的元素沉下去,一直这样做,直到n-1遍以后该列表就排序完成
//冒泡排序
void bubble_sort(int *arr,size_t len)
{
for(int i=len-1;i>0;i--)
{
bool flag=true;
for(int j=0;j<i;j++)
{
if(arr[j]>arr[j+1])
{
int t=arr[j];
arr[j]=arr[j+1];
arr[j+1]=t;
flag=true;
}
}
if(flag) break;
}
}
冒泡排序是稳定的排序,它具有对数据的敏感性,如果列表数据已经基本有序,那么使用冒泡排序是比较快速的
冒泡排序的时间复杂度:最优情况O(N),最劣O(N^2)
2、选择排序
选择排序开始的时候,我们扫描整个列表,找到最小的元素和第一个进行交换,将最小的元素放在它最终的位置上。n-1遍以后列表就是有序的了。
//选择排序
void select_sort(int* arr,size_t len)
{
for(int i=len-1;i>0;i--)
{
int max=i;
for(int j=0;j<i;j++)
{
if(arr[j]>arr[max])
{
max=j;
}
if(max !=i)
{
int i=arr[j];
arr[j]=arr[max];
arr[max]=i;
}
}
}
}
选择排序实际上是冒泡排序的变种,和冒泡排序不同的是,它并不直接交换元素的位置,而是记录元素的下标,比较完成以后再进行位置交换。在数据比较混乱的情况下,它比冒泡排序要快。但是选择排序也失去了对数据的敏感性
选择排序的时间复杂度:O(N^2)
3、顺序查找
该算法是典型的蛮力算法,它有着蛮力法典型的优点:简单 缺点:效率低下
该算法只是简单的将给定列表的连续元素和给定的查找键进行比较,直到遇到一个匹配的元素(成功查找),或遍历了一遍列表(失败查找)
//顺序查找
int order_find(int* arr,size_t len,int key)
{
for(int i=0; i<len; i++)
{
if(arr[i] == key)
return i;
}
return -1;
}