采用分治法求解一个乱序数组中距离最近的两个数
例如:3,4,1,6,71,19,10,25 返回1 即返回(4-3=1)的值。
采用分治法的算法如下:
简单分享思想:
从数组中间取个数,假设为Ai,用Ai将数组分成了两部分,分别求出左部分的距离最小值,右部分的距离最小值,继续计算所有其他元素离Ai的最小距离,从这三个距离中选择最小的距离即可。
具体C语言算法如下:
#include<stdio.h>
//宏定义 返回|a-b|的绝对值
#define AB(a,b) a>b?(a-b):(b-a)
//返回一个数组中指定mid的最短距离
int get(int arr[],int low,int high,int mid)
{
int temp=AB(arr[low],arr[mid]);
for(int i=low+1;i<=high;i++)
{
if(i==mid)continue;
int one=AB(arr[i],arr[mid]);
if(one<temp)temp=one;
}
return temp;
}
//返回三个数的最小值
int min(int a,int b,int c)
{
if(a<b && a<c)return a;
if(b<a && b<c)return b;
if(c<a && c<b)return c;
}
//采用分治法,返回一个数组两个数的最小距离
int minlen(int arr[],int low,int high)
{
if(high==low)return 0;
if(high-low==1)
{
return AB(arr[high],arr[low]);
}
else
{
int mid=low+(high-low)/2;
int temp=get(arr,low,high,mid);
//左子树 右子树 temp分治
return min(minlen(arr,low,mid-1),minlen(arr,mid+1,high),temp);
}
}
int main()
{
//测试数据
int a[]={31,6,38,90,20};
printf("%d\n",minlen(a,0,4));
return 0;
}
本文来自IT部落格,转载请注明,http://www.itbuluoge.com,~致力于编程、算法、数据库技术的分享