螺钉螺帽问题
假设有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