找到解决方案来对扫描数组的数组进行一次排序

时间:2015-06-28 21:34:47

标签: java arrays quicksort

package recursion;
public class QuickSort {

public static void quickSort(int[] input,int beginIndex,int endIndex)
{
    if(beginIndex>=endIndex)
    {
        return;
    }

    int pivotIndex = partition(input,beginIndex,endIndex);

    quickSort(input, beginIndex, pivotIndex-1);

    quickSort(input, pivotIndex+1, endIndex);
}

public static int partition(int[] input,int beginIndex,int endIndex)
{
    int count = 0;
    int pivotElement = input[beginIndex];
    for(int i = beginIndex+1;i<=endIndex;i++)
    {
        if(pivotElement >= input[i])
            count++;
    }

    int temp2 = beginIndex;


    int temp = pivotElement;
    input[beginIndex] = input[count+beginIndex];
    input[count+beginIndex] = temp;

    while(beginIndex < endIndex)
    {
        if(input[beginIndex] <= pivotElement)
        {

            beginIndex++;
        }
        else if(input[endIndex]>pivotElement)
        {

            endIndex--;
        }

        else            
        {
            int temp3 = input[beginIndex];
            input[beginIndex] = input[endIndex];
            input[endIndex] = temp3;

        }
    }

    return temp2 + count;


}

public static void main(String[] args) {
    // TODO Auto-generated method stub

    int[] n = {0,1,0,2,2,1,1,0};
    quickSort(n, 0, 7);

    for(int i = 0;i<=7;i++)
    {
        System.out.println(n[i]);
    }

}

}

给定一个只包含0,1和2的数组,我想将我的pivot元素设置为等于1,以便所有0都在它之前,所有的2都在它之后 这样它只会扫描一次数组。 但是我无法将我的pivot元素设置为1

所以请帮我解决这个问题!

1 个答案:

答案 0 :(得分:1)

使用counting sort。创建一个长度为3的数组。对于每个输入,将一个添加到计数数组的相应索引中。最后,迭代计数数组并创建一个输出数组。像

这样的东西
public static int[] countingSort(int[] input) {
    int[] count = new int[3];
    for (int i : input) {
        count[i]++;
    }
    int pos = 0;
    int[] output = new int[input.length];
    for (int i = 0; i < count.length; i++) {
        for (int t = 0; t < count[i]; t++) {
            output[pos++] = i;
        }
    }
    return output;
}