一、排序算法
本质上就是按照某种顺序将一组数排好,分多次重复进行,每次只负责把一个数字放到合适的位置上
两种思路:
①先确定一个数字,然后根据数据找合适的位置
②先确定一个位置,根据位置找合适的数字
1、冒泡排序算法(先确定位置,选最前面或者最后面)
假设选择了最后面的位置,就是重复的把最大的数放到最后面,例如:
代码实现:
2、选择排序算法(只能选择最前面最后面的位置)
那选择的位置向前或者向后依次与每一个数做顺序调整,例如:
代码实现:
3、插入排序
先确定数字,假设前面的数已经排序好,把它们和相邻的后面的那个数字作为选定数字,把选定数字向前插入到合适的位置
4、快速排序
在数组中从头部或尾部选择一个数,然后进行排序,比如比它小的在左,比它大的在右,这个数就是枢轴,每次与枢轴进行比较进行顺序调整后的数,我们认为他们的相对位置已经固定,那么这个数就排出在外,不再处理。
排好左右,左右两边分成两部分,在各自选定一个数再次进行这样的排序,注意只能从数组的两头选数,以此类推。
这可以用递归函数来实现
代码实现:
二、查找算法
1、遍历查找
这种查找方式就是遍历所有元素进行查找,是最常见的也最好理解的查找方式,这我们在之前顺序表、链表之类的数据结构中查找已经经常用到,就是依次与所有数字作比较,找到想要的那一个,适合完全没有规律的排列方式
以下两种都适合有规律的数字排列
2、拆半查找
适合数字由大到小或由小到大已经实现排列好了,当我们查找数字时,可以直接与中间数字做对比,这样每次就可以排除剩下一半的数量
假设一组数已经从小到大排列好了,那么我们选取它中间的那个数对比,比它小那么这个数在它左边,比它大这个数在它右边,然后在选取它所在的那一半,继续这样判断。
返回是查找数在数组中的位置
3、分块查找(说一下思想)
索引表 + 源数据表的方式
//索引表
typedef struct
{
int max; //块中最大值
int post;//块的起始位置下标,post数组下标
}index_t; //索引
创建一个结构体数组即可,每个结构体数组根据源数组给定索引表中数据即可