算法设计与分析总结
递归问题
讲一个大型问题转化为与原问题类似的小问题来解决
全排列问题
//全排列
public static void fullSort(int[] arr,int k,int m){
if(k==m){
for(int i=0;i<=m;i++){
System.out.print(arr[i]);
}
System.out.println();
}else {
for(int i=k;i<=m;i++){
int t=arr[k];arr[k]=arr[i];arr[i]=t;
fullSort(arr,k+1,m);
t=arr[k];arr[k]=arr[i];arr[i]=t;
}
}
}
分治法
特征:
1、最优子结构性质(原问题的最优解包含了子问题的最优解)
2、子问题相互独立,子问题可以合并为原问题的解
并归排序
//并归排序
public static void mergeSort(int[] arr, int L, int R) {
if(L == R) {
return;
}
int mid = L + ((R - L) >> 1);
mergeSort(arr, L, mid);
mergeSort(arr, mid + 1, R);
merge(arr, L, mid, R);
}
public static void merge(int[] arr, int L, int mid, int R) {
int[] temp = new int[R - L + 1];
int i = 0;
int p1 = L;
int p2 = mid + 1;
// 比较左右两部分的元素,哪个小,把那个元素填入temp中
while(p1 <= mid && p2 <= R) {
temp[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++