本博客是《算法设计与分析》课程的课上写的可运行代码记录,仅用于方便查看,代码思路非个人原创
查找最大和次大元素
#include<iostream>
using namespace std;
#define max(x,y)(x>y?x:y)
#define min(x,y)(x<y?x:y)
#define INF 9999999
void solve(int a[], int low, int high, int& max1, int& max2) {
if (low == high) {
max1 = a[low];
max2 = -INF;
}
else if (low == high - 1) {
max1 = max(a[low], a[high]);
max2 = min(a[low], a[high]);
}
else {
int mid = (low + high) / 2;
int lmax1, lmax2, rmax1, rmax2;
solve(a, low, mid, lmax1, lmax2);
solve(a, mid + 1, high, rmax1, rmax2);
if (lmax1 > rmax1) {
max1 = lmax1;
max2 = max(lmax2, rmax1);
}
else {
max1 = rmax1;
max2 = max(lmax1, rmax2);
}
}
}
int main() {
int a[] = { 76,23,37,90,14 };
int n = sizeof(a) / sizeof(a[0]);
int max1, max2;
solve(a, 0, n - 1, max1, max2);
cout << "最大值为:" << max1 << " 次大值为:" << max2;
}
折半查找
#include<stdio.h>
int BinSearch(int a[], int low, int high, int k) {
int mid;
if (low <= high) {
mid = (low + high) / 2;
if (a[mid] == k)
return mid;
if (a[mid] > k)
return BinSearch(a, low, mid - 1, k);
else
return BinSearch(a, mid + 1, high, k);
}
else return -1;
}
int main() {
int n = 10, i;
int a[] = { 1,12,23,34,45,56,67,78,89,90 };
int k = 45;
i = BinSearch(a, 0, n - 1, k);
if (i >= 0)
printf("找到元素a[%d]=%d\n", i, k);
else
printf("未找到%d元素/n", k);
}