目录
一、查找算法
1.顺序查找(线性查找)
依据数组的下标按顺序进行查找,然后返回数组下标。对于数据量较小的情况,比较适用。但是如果数据量较大,花费的时间就比较多。
2.二分查找
二分查找 Binary Search
二分查找的使用,要有一个前提条件:要查找的数必须在一个有序数组里。在这个前提下,取中间位置数作为比较对象:
- 若要查找的值和中间数相等,则查找成功。
- 若小于中间数,则在中间位置的左半区继续查找。
- 若大于中间数,则在中间位置的右半区继续查找。
不断重复上述过程,直到查找成功或者查找区域变为 0,查找失败。
二、排序算法
1.冒泡排序
按从小到大排序举例:
1.比较相邻的两个元素,若前边的元素大于后边的元素则交换。
2.每一对相邻元素都要进行比较。每一个轮次,将最大的排到最后。
3.针对剩余的元素,重复上述步骤
4.没有元素交换,完成排序。
2.直接选择排序
- 第一趟,程序将记录定位在第一个数据上,拿第一个数据依次和后面的数据进行比较,如果第一个数据大,交换,依次类推。经过第一趟比较,这组数据中最小的数据被选出来,排在第一位。
- 第二趟,程序将记录定位在第二个数据上,拿第二个数据依次和后面的数据比较,同样地,第二个数据大就交换。经过第二次比较,这轮最小的书被选出来,放在了第二位。
这样经过n-1次比较,这组数据就会变得有序。
3.插入排序
插入排序是一种简单直观的排序算法,其核心思想是将未排序的元素逐个插入到已排序的序列中,直到所有元素都被插入完成。插入排序可以分为两种形式:直接插入排序和二分插入排序(也称为折半插入排序)。
插入排序的定义:
插入排序算法:是基于某序列已经有序排列的情况下,通过一次插入一个元素的方式按照原有排序方式增加元素
插入排序的思路:
- 默认从第2个数据开始比较。如果第2个数据比第1个小,则交换。
- 然后在用第3个数据比较,如果比前面小,则插入。否则,退出循环。
- 说明:默认将第1数据看成有序列表,后面无序的列表循环每一个数据,如果比前面的数据小则插入(交换)。否则退出。
4.直接插入排序
直接插入排序的过程如下:
- 从未排序序列中取出一个元素,将其与已排序的序列比较,找到合适的插入位置。
- 如果比较的元素大于待插入元素,则将比较元素向后移动一个位置,为待插入元素腾出空间。
- 重复步骤2,直到找到插入位置为止。
- 将待插入元素插入到找到的位置。
算法实现:
一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:
①. 从第一个元素开始,该元素可以认为已经被排序
②. 取出下一个元素,在已经排序的元素序列中从后向前扫描
③. 如果该元素(已排序)大于新元素,将该元素移到下一位置
④. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
⑤. 将新元素插入到该位置后
⑥. 重复步骤②~⑤
5.二分插入排序(折半插入排序)
二分插入排序的特点是:
- 稳定性:相等元素的相对位置不会改变。
- 时间复杂度:最好情况下(已排序序列),时间复杂度为O(nlogn),最坏情况下(逆序序列),时间复杂度为O(n^2)。
- 空间复杂度:O(1)。
实现:
总结:
直接插入排序和二分插入排序的区别在于查找插入位置的方式不同,二分插入排序在查找插入位置时利用了二分查找的思想,从而提高了查找效率。但是对于小规模的数据排序,两种算法的差异并不明显。