左神算法课p3
1.master公式分析递归函数的时间复杂度
2.递归求解数组最大值
使用master公式分析以下程序时间复杂度为O(n)
#include<iostream>
using namespace std;
int Max(int a, int b) {
return a > b ? a : b;
}
int ArrMax(int *arr, int left, int right) {
if (left == right) //递归出口
return arr[left];
int mid = (left + right) / 2;
int left_part_max = ArrMax(arr, left, mid);
int right_part_max = ArrMax(arr, mid + 1, right);
return Max(left_part_max, right_part_max);
}
int main() {
int test[] = {
3,4,1,8,6,4,2,6,9,4,1 };
int len = (sizeof(test) / sizeof(test[0]));
cout << ArrMax(test, 0, len - 1);
}
3.归并排序
1.补充–new和delete的用法
2.归并排序
#include<iostream>
using namespace std;
void Print(int *arr, int len) {
for (int i = 0; i < len; i++)
cout << arr[i] << ' ';
cout << endl;
}
void Merge(int *arr, int left, int mid, int right) {
int *res = new int[right - left + 1];
if (res == NULL) {
cout << "内存不足" << endl;
return;
}
int i = left, j = mid + 1, k = 0;
while (i <= mid && j <= right)
res[k++] = arr[i] < arr[j] ? arr[i++] : arr[j++];
while (i <= mid)
res[k++] = arr[i++];
while (j <= right)
res[k++] = arr[j++];
//将排好序的res覆盖arr,注意下标不同,但一一对应
for (int m = left, n = 0; m <= right; m++, n++)
arr[m] = res[n];
//释放res
delete []res;
res = NULL;
}
void MergeSort(int *arr, int left, int right) {
if (left == right) //递归出口
return;
int mid = (left + right) / 2;
//分解
MergeSort(arr, left, mid);
MergeSort(arr, mid + 1, right);
//有序合并
Merge(arr, left, mid, right);
}
int main() {
int test[] = {
2,4,1,6,5,8,9,0 };
Print(test, 8);
MergeSort(test, 0, 7);