分治法:求解一个乱序数组中距离最近的两个数

采用分治法求解一个乱序数组中距离最近的两个数

例如:3,4,1,6,71,19,10,25  返回1  即返回(4-3=1)的值。

采用分治法的算法如下:

分治法:求解一个乱序数组中距离最近的两个数_第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,~致力于编程、算法、数据库技术的分享

你可能感兴趣的:(分治法:求解一个乱序数组中距离最近的两个数)