quick sort非常好的题。用bolts[start]将nuts partition成两部分,得到中间值pivot,再用nuts[pivot]将bolts分成两部分。再对pivot两边进行recursion
public class Solution {
public void sortNutsAndBolts(int[] nuts, int[] bolts) {
if (nuts == null || nuts.length <= 1) {
return;
}
sub(nuts, bolts, 0, bolts.length - 1);
}
private void sub(int[] nuts, int[] bolts, int start, int end) {
if (start >= end) {
return;
}
int pivot = bolts[start];
//sort nuts using bolt as pivot
int index = sortNuts(nuts, pivot, start, end);
//sort bolts using nuts[j-1] as pivot
pivot = nuts[index];
sortBolts(bolts, pivot, start, end);
sub(nuts, bolts, start, index - 1);
sub(nuts, bolts, index+1, end);
}
private int sortNuts(int[] nuts, int pivot, int start, int end) {
int i = start-1, j = end+1;
for (int index = start; index < j; index++) {
if (Compare.cmp(nuts[index], pivot) == -1) {
int tmp = nuts[++i];
nuts[i] = nuts[index];
nuts[index] = tmp;
} else if (Compare.cmp(nuts[index], pivot) == 1) {
int tmp = nuts[--j];
nuts[j] = nuts[index];
nuts[index] = tmp;
index--;
}
}
return j-1;
}
private int sortBolts(int[] bolts, int pivot, int start, int end) {
int i = start-1, j = end+1;
for (int index = start; index < j; index++) {
if (Compare.cmp(pivot, bolts[index]) == -1) {
int tmp = bolts[--j];
bolts[j] = bolts[index];
bolts[index] = tmp;
index--;
} else if (Compare.cmp(pivot, bolts[index]) == 1) {
int tmp = bolts[++i];
bolts[i] = bolts[index];
bolts[index] = tmp;
}
}
return j-1;
}
};