题目描述
最近,小L遇到了一道难题,请你帮帮他。给出n个数,请找出这个序列的任意两个不同的数第二小的差值。ai和 aj 的差值定义为∣ai −aj∣,即两个数差的绝对值,其中i和j互不相同。(第二小即从小到大排序之后的第二个数字)
输入格式:
第一行为一个正整数n (3≤n≤105),代表数组的长度。接下来一行,共n个整数ai(−109≤ai ≤10^9).
输出格式:
输出一个数字,表示这个序列的任意两个不同的数中第二小的差值。
输入样例1:
6
11 4 7 1 16 2输出样例1:
2
输入样例2:
6
10 1 2 4 15 6输出样例2:
2
源代码
#include <stdio.h>
void p1(int a[],int n);
void p2(int a[],int n,int q,int w);
int p4(int a[],int q,int w);
int main()
{
int n,place,i,j;
scanf("%d",&n);
getchar();
int arr[n];
for(i=0;i<n;i++)
scanf("%d",&arr[i]);
p1(arr,n);
int p[n-1];
for(i=0;i<n-2;i++) //最后一个i的元素值是 n-3
{
p[i]=arr[i+1]-arr[i];
}
p1(p,n-2); //i最后是n-3 因此总数是n-2
printf("%d",p[1]);
return 0;
}
void p1(int a[],int n)
{
p2(a,n,0,n-1);
}
void p2(int a[],int n,int q,int w)
{
int p3;
if(q<w)
{
p3=p4(a,q,w);
p2(a,n,q,p3-1);
p2(a,n,p3+1,w);
}
}
int p4(int a[],int q,int w)
{
int t,p3;
p3=a[q];
t=a[q];
while(q<w)
{
while(q<w&&a[w]>=p3)
w--;
if(q<w)
{
a[q]=a[w];
q++;
}
while(q<w&&a[q]<=p3)
q++;
if(q<w)
{
a[w]=a[q];
}
a[q]=t;
}
return q;
}