采用分治法求解一个乱序数组中距离最近的两个数
例如: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; }