[算法设计与分析]4.3.5非等分分治(一组数的第二小)
#include<stdio.h>
#include<iostream>
#include<cstring>
using namespace std;
const int N = 7;
int SecondSmall(int a[], int n);
void FindTwo(int a[], int i, int j, int &fmin1, int &fmin2);
int main ()
{
int a[N] = {2, 3, 1, 6, 5, 9, 0};
cout << SecondSmall(a, N) << " is the second small number" << endl;
}
//利用查找最小的两个数 才可以将原问题进行分解
int SecondSmall(int a[], int n)
{
int min1, min2;
FindTwo(a, 0, n - 1, min1, min2);
return min2;
}
void FindTwo(int a[], int i, int j, int &fmin1, int &fmin2)
{
int lmin1, lmin2, rmin1, rmin2;
int mid;
//递归出口
if(i == j)
fmin2 = fmin1 = a[i];
else if(i == j - 1)
{
fmin2 = a[i] > a[j] ? a[i] : a[j];//fmin2存储较大
fmin1 = a[i] > a[j] ? a[j] : a[i];
}
else
{
mid = (i + j) / 2;
FindTwo(a, i, mid, lmin1, lmin2);
FindTwo(a, mid + 1, j, rmin1, rmin2);
if(lmin1 < rmin1)
{
fmin1 = lmin1;
if(lmin1 != lmin2 && lmin2 < rmin1)//此处一定要加一个判断条件 以避免递归出口为i==j的情况min1和min2的值相同
fmin2 = lmin2;//Eg:2 3 1 则rmin1=rmin2=1 此时经过判读 则fmin1=fmin2=1 显然是错误的
//因此该判断取值是否相等
else
fmin2 = rmin1;
}
else
{
fmin1 = rmin1;
if(rmin1 != rmin2 && rmin2 < lmin1)
fmin2 = rmin2;
else
fmin2 = lmin1;
}
}
}
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: 寻找第二小的数
- 下一篇: 几分钟搞懂c#之FileStream对象读写大文件
