我有一个家庭作业问题,给我这个数组:
[3,22,1,5,5,6,10,4]
我需要将所有大于最后一个值4的数字移至该值的右侧,并将所有小于该值的数值移至左侧。
数字不一定必须按顺序排列。因此,该程序的输出为:
[3,1,4,22,5,6,10]
出于某种原因,我真的很努力地想出一种允许这种情况发生的算法。我尝试过创建一个循环,该循环用较大的数字交换最后一个值,但是如果在数组中某个位置混合了一个最小值,则该奇数将位于不正确值的右侧。
有人可以帮我吗?
答案 0 :(得分:2)
我不会帮助您完成家庭作业。但是,我将指导您思考您的这个例子的去向。这是快速排序的第一步-对数组进行分区。
public class QuickSortImpl {
private static void swap(int[] array, int l, int h) {
int temp = array[h];
array[h] = array[l];
array[l] = temp;
}
public static int partition(int[] array, int low, int high) {
int pivot = high;
int firsthigh = low;
int x,y;
for (int i = low; i < high; i++) {
x = array[i];
y = array[pivot];
if (array[i] < array[pivot]) {
swap(array, i, firsthigh);
firsthigh++;
}
}
swap(array, pivot, firsthigh);
return firsthigh;
}
private static void printArray(int[] arr ) {
for ( int i =0; i < arr.length; i++ ) {
System.out.print(" " + arr[i]);
}
System.out.println();
}
public static void quickSort(int[] array, int low, int high) {
if ( low < high ) {
int pivot = partition(array, low, high);
quickSort(array, low, pivot - 1);
quickSort(array, pivot + 1, high);
}
}
public static void main(String[] args) {
int[] arr = { 3, 22, 1, 5, 6, 10, 4};
quickSort(arr, 0, arr.length -1 );
printArray(arr);
}
}
答案 1 :(得分:0)
@brent_mb,请看以下简单示例来说明您的原因:
public static void main(String[] args) {
Integer[] listOfNumbers = {1,4,5,6,74,2,7,8,5,2,6,989,3};
//sort by number 6
FirstCustomComparator comparator = new FirstCustomComparator(6);
Arrays.sort(listOfNumbers, 0, listOfNumbers.length, comparator);
for (int number : listOfNumbers) {
System.out.print(number+" ");
}
}
FirstCustomComparator类:
public class FirstCustomComparator implements Comparator<Integer> {
private final int exception;
public FirstCustomComparator(int i)
{
exception = i;
}
@Override
public int compare(Integer a, Integer b)
{
if (a < exception)
{
return -1;
}
return a.compareTo(b);
}
}