仅在阵列的一半上实现快速排序

时间:2013-06-15 12:23:59

标签: java arrays quicksort

我有一个练习,我必须改进算法。这个algorithem采用一个数组并将平均值放在左侧(SORTED),将赔率放在右侧(NOT-SORTED)。 算法是低效的,所以我必须改进它。

以下是练习的原始代码,我必须“改进”:

public void what (int [] arr) {
    int temp;
    for (int i=0; i<arr.length; i++)
        if (arr[i]%2 == 0) {
            temp = arr[i];
            for (int j=i; j>0; j--)
                arr[j] = arr[j-1];
            arr[0] = temp;
    }
}

我想在这个练习上实现快速排序算法,但问题是我不知道如何使用枢轴:通常,枢轴是中位数,数组的一半是较小的,另一半是大。

这里的问题是左边部分必须是平均值,右边部分是赔率。

我必须以低于O(n ^ 2)的效率实现这种“排序”。

有什么想法吗?

谢谢!

3 个答案:

答案 0 :(得分:0)

如何有两个索引,一个从开始(i = -1)开始,一个从结束开始(j = a.length)。递增i并将偶数和递减j放入奇数。一旦迭代完成,我将指向偶数元素的最后一个元素。应用快速排序将中间元素作为枢轴(即从0到i)。

答案 1 :(得分:0)

建议一:线性穿过数组并将其分成两个 - 偶数元素和奇数元素。这需要Theta(n)时间。当您进行线性扫描并且无论如何都要检查每个元素时,您可以找出哪个是最大的,哪个是最小的元素。然后你可以在偶数整数数组上实现计数排序。计算排序示例:

Counting sort interactive Counting sort video

计算排序运行时间是O(n)摊销,因此算法的总运行时间为O(n)。

建议二:如果你想使用quicksort,威胁每个奇数值为+无穷大,它自然会在列表的末尾,而不进行比较。如果您碰巧选择奇数支点,只需将其放在最后,然后再试一次。我建议使用随机数据而不是第一个/最后一个。

答案 2 :(得分:0)

正如@zerocool建议的那样,由代码实现:

private static int medianEven(int [] arr){
        int i=-1, j=arr.length; int temp=0; int w=0;
        while ((w<j)){
            if (arr[w]%2==0){
                i++;
                w++;
            }
            else
            {
                temp=arr[j-1];
                arr[j-1]=arr[w];
                arr[w]=temp;
                j--;
            }
        }
        return i;

    }

之后,从arr [0]调用quickSort方法到arr [i]:

quicksort(arr,0,i);

感谢您的建议。