黄毅然的JAVA学习(五)

螺钉螺帽问题

假设有N个螺丝和N个螺丝帽混在一堆,需要将它们快速配对。一个螺丝只会匹配一个螺丝帽,一个螺丝帽也只会匹配一个螺丝。可以试着把一个螺丝和一个螺丝帽拧在一起,看看哪一个大了,但不能直接比较两个螺丝或者螺丝帽的大小。给出一个解决此问题的有效方法。

该问题可以使用改进型的快速排序办法。

//黄毅然已经两个月没有更新CSDN了,这个排序弄得我挺头疼的,在此感谢大佬@zy的指导,/舔一舔/ //
import java.util.Random;
public class screw {
	public static void printArray(int[] num) 
	{
        for(int i : num)
        {
            System.out.printf("%d\t", i);
        }
        System.out.println('\n');
    }
	public static void exchange(int []num,int i,int j)
	{
		int tmp=num[i];
		num[i]=num[j];
		num[j]=tmp;
	}
	public static int partition(int []nut,int []screw,int s,int t)
	{
		int i=s,j=t;
		int x=s,y=t;
		int tmp=nut[i];
		while(i<j)
		{
			while(i<j&&screw[j]>tmp) j--;
			while(i<j&&screw[i]<tmp) i++;
			if(i<j) exchange(screw,i,j);
		}	
		while(x<y)
		{
			while(s<t&&nut[y]>tmp) y--;
			while(s<t&&nut[x]<tmp) x++;
			if(x<y) exchange(nut,x,y);
		}
		return i;
	}
	public static void quicksort(int []nut,int []screw,int s,int t)
	{
		int i;
		if(s<t)
		{
			i=partition(nut,screw,s,t);
			quicksort(nut,screw,s,i-1);
			quicksort(nut,screw,i+1,t);
		}
	}

	 public static void flushArr(int[] arr)
	 {
	        int length = arr.length;
	        int index = length - 1;
	        for(int i = 0; i < length && index > 0 ; i++){
	            int num = createRandom(index);
	            int temp = arr[num];
	            arr[num] = arr[index];
	            arr[index] = temp;
	            index--;
	        }
	    }
	    public static int createRandom(int end){
	        return (new Random().nextInt(end));
	    }
	public static void main(String []args)
	{
		int []screw=new int[10];
		int []nut=new int[10];
		for(int i=0;i<10;i++)
		{
			Random rand=new Random();
			screw[i]=rand.nextInt(100);
			nut[i]=screw[i];
		}
		flushArr(nut);
		printArray(nut);
		printArray(screw);
		quicksort(nut,screw,0,9);
		printArray(screw);
		printArray(nut);
	}
}

由于生成的是随机数,结果不会完全一致
将会类似下面的
72 79 78 30 64 14 47 9 1 3

47 3 30 1 14 72 9 78 79 64

1 3 9 14 30 47 64 72 78 79

1 3 9 14 30 47 64 72 78 79

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值