有些算法是一定要背下来的,为了方便背诵,总结了每种算法的要点。
1.排序
这里主要讲解归并排序和快速排序,为什么主要讲这两个呢,因为这两的时间复杂度都是o(nlogn),其次他们都是采用了递归的思想。
为了背下来这两个算法,就需要深刻理解递归。
所有的递归问题,本质都可以分为三点:
1.一个大问题,可以分解为若干有限个小问题;
2.这些被分解出来的小问题,除了在数据规模上低于大问题,问题内容和解决思路完全和大问题一致;
3.存在递归终止条件,不然会爆栈。
1.1归并排序
思想:归并排序的思想就是递归,大问题是:给数组排好序,小问题是:可以将数组从中间一分为二,然后给两个小数组排序。两个小数组排好序之后可以合并在一起
递推公式:merge_sort(0~n)=merge(merge_sort(0~n/2),merge_sort(n/2,n))
1.2快速排序
思想:快速排序思想也是递归,大问题是:给数组排好序。然后选取数组中某个元素K,将数组一分为2,比K大的放在右边数组,比K小的放在左边。小问题是:左右两边的数组排好序。
递推公式:quick_sort(0~n)=partation(left~right,k)+quick_sort(left~k)+quick_sort(k~right)
具体代码自己写,有了思想就很好写了。
2.二分查找
二分查找只能用在有序数组上,直接上java代码:
public int bsearch(int[] a, int n, int value) {
int low = 0;
int high = n - 1;
while (low <= high) {
int mid = (low + high) / 2;
if (a[mid] == value) {
return mid;
} else if (a[mid] < value) {
low = mid + 1;
} else {
high = mid - 1;
}
}
return -1;
}
三个注意事项:
1.第4行一定是:low <= high,因为如果最后依次查找还剩一个元素且就是要找的元素,如果写low<high就会错过
2.第9,11行的low=mid+1中,+1是不能去掉的,如果最后还剩一个元素,low=high=mid,如果没有+1会产生死循环。