java 通过快排求最小管道和

本文介绍如何使用Java的快速排序算法来找到管道序列中的最小和,详细阐述了排序过程及算法思想。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:





思路:铺设油管与水平距离无关,只与竖直距离有关,对此建立坐标系求解y值中位数(y_mid),并将各点纵坐标到y_mid的距离累加,累加后的值便是所要的最小距离。

数组x,y:分别存储坐标点
快排:求中位数


import java.util.Scanner;

public class Demo{

    static int n;//管道数

    public static void main(String[] args) {
        System.out.println("请输入管道数目:");
        Scanner sc=new Scanner(System.in);
         n=sc.nextInt();//管道个数
        int[] x_arr=new int[n];//x轴坐标的值
        int[] y_arr=new int[n];//y轴坐标的值


        System.out.println("请输入坐标值:");
        for(int i=0;i<n;i++){
            x_arr[i]=sc.nextInt();
            y_arr[i]=sc.nextInt();
        }

        //对数组y_arr的值进行排序
        quickSort(0,n-1,y_arr);

        //求y轴值的中位数
        int mid=0;
        if(n%2==0){//n为偶数
            mid= (y_arr[n/2-1]+y_arr[n/2])/2;
        }
        else{//n为奇数
           mid=y_arr[n/2];
        }

        int j=1;//计管道数,只为输出好看点
        for (int k:y_arr ) {
            System.out.println("子管道"+j+++"的长度:"+k);
        }

        //对y数组所有值到中位数的距离进行累加
        int len=0;
        for(int i=0;i<n;i++){
            //当y值小于中位数
            if(y_arr[i]<mid){
                len+=(mid-y_arr[i]);
            }
            //当y值大于中位数
            else
                len+=(y_arr[i]-mid);
        }
        System.out.println("管道长度总和最小值为:"+len);
    }


    ///划分
    static int Parition(int[] arr,int first,int end){
        int i=first,j=end;
        while (i<j){//当i<j时进入循环
            while (i < j && arr[i] <= arr[j]) {//i和j未碰头且左边小于等于右边
                j--;
            }
            if(i<j){//判断是否碰头
                int temp;
                temp=arr[i];
                arr[i]=arr[j];
                arr[j]=temp;
                i++;
            }
            while(i<j&&arr[i]<=arr[j]){
                i++;
            }
            if(i<j){
                int temp;
                temp=arr[i];
                arr[i]=arr[j];
                arr[j]=temp;
                j++;
            }
        }
        return i;//排序后基准值下标
    }

        static void quickSort(int start,int end,int[] arr){
            int middle;
            if(start<end){
                middle=Parition(arr,start,end);//划分,mid
                quickSort(start,middle-1,arr);
                quickSort(middle+1,end,arr);
            }
        }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值