1.折半查找
low mid high指针
mid可能和low指向同一个单元
mid=(low+high)/2 向下取整
low | high |
也有可能三个都指向同一个单元
| |
|–|-
| low mid high |
要找的key == high中
关键点
1.
low | high |
此时low==mid |
2.key==high时
low / mid | high |
low=mid+1 | |
mid=(low+high)/2 | |
此时low , high , mid 处于同一格 |
3.退出的条件
由于可以 low=high=mid(查找的最后一次)
所以找不到(退出)的条件是 low>high
找到到的条件是(low<=high) / while(low<=high){ }
2.冒泡排序
原理图:
a[i] 控制比较的 轮数
(一个数不用比较,两个数比较一次,三个数比较两次……)
i最大为 数组长度-1
(i=1;i<数组长度;i++)
a[j]是实际参与比较的数
j 从0开始
a[j]和a[j+1]比较,如果大于则交换
每一轮中,j都从0开始
每一轮当中,都把最大的数放到了最后
所以最末尾的数是确定的,后面的轮次中不用和已经排好序的来比较
每一轮确定一个数,轮次是i
所以不确定的数是 数组长度 - i
所以(j=0 ; j < 数组长度-i ; j++)
3.选择排序
每次(从第i次开始)从数组中未排序的部分找到一个最小的,来和第i个位置的数交换
i 从0开始
4.插入排序
向后挪:在已经有空档(a[i+1] 数可以被直接抹去 )情况下
a[i+1]=a[i] , a[i]=a[i-1] , a[i-1]=a[i-2] …… 依次下去
就是挪动
依次遍历,未排序的部分中的每一个 a[i]
将每一个都插入到已排序的部分
已排序部分(需要存在1个数) j
未排序部分,从1号下标开始 i
j=i-1
将目前正在操作的数保存下来,从已排序部分a [j] 的最后一个开始向前比较 j–
如果不符合条件,向后挪动,
挪动过程中的空档用 正在操作的数temp 填充一下
(挪动–插入)
每一步都插入
也可以在最后再插入
5.希尔排序
分组,组内使用插入排序
由步长确定分组,一开始为 a.length /2
然后每次都是: 前一次 /2
分组方法:确定一个interval 组中每一个都是前一个+interval
int interval=a.length/2;interval>0;interval=interval/2
组内 插入排序
for(){
while(){ }
}
6.递归
将问题拆成很小的每一步
最小可以拆成什么样
递归的 最后一步 和 它的前一步
用非递归表示出他们的关系