相关代码:
#include <stdio.h>
#include <stdlib.h>
#include<math.h>
#include<time.h>
#define T 300
int partition(int arr[], int low, int high){
int key;
key = arr[low];
while(low<high){
while(low <high && arr[high]>= key )
high--;
if(low<high)
arr[low++] = arr[high];
while( low<high && arr[low]<=key )
low++;
if(low<high)
arr[high--] = arr[low];
}
arr[low] = key;
return low;
}
void quick_sort(int arr[], int start, int end, int mid){
int pos;
if (start<end){
pos = partition(arr, start, end);
if(pos==mid) return;//如果直接求到中位数就返回
if(pos>mid) quick_sort(arr,start,pos-1 ,mid);//如果当前确定好的位置在mid右边,则放弃左边
if(pos<mid) quick_sort(arr,pos+1,end,mid);//如果当前确定好的位置在mid左边,则放弃右边
}
return;
}
int main(void){
int i,M;
int arr[T];
printf("请输入油井的总个数,不要超过300\n");
scanf("%d", &M);
srand(time(0));
printf("随机产生油井的横纵坐标\n");
for(i = 0; i < M; i ++)
{
arr[i]=(int)rand()%20000-10000;
printf("第%d个油井的横纵坐标分别为 %d , %d\n", i,(int)rand()%20000-10000, arr[i]);
}
printf("排完序后油井的纵坐标的序列\n");
int mid=M/2;
quick_sort(arr,0,M-1,mid);
printf("\n 排序后 \n");
for(i=0; i<M; i++)
printf("%d\t", arr[i]);
printf ("\n");
printf("所需要的结果是: %d",arr[mid]);
system("pause");
return 0;
}
解析:输油管道问题只和油井的y坐标有关,和x坐标没有关系。而对于最外侧的两个油井,主干道设计在两者之间是最节省材料的,两者之间无论是那个地方结果都一样。然后用同样的方式分析次外侧的两个油井,依次类推。结果主干道的位置应该就是中位数的位置。我们需要找到所有y坐标的中位数。结合快速排序法的思想,但是每次排序后抛弃不带有中位数的一边,就可以再线性时间内找到中位数。找到中位数后问题就会迎刃而解!