Java 仅在数组的一半上实现快速排序

Java 仅在数组的一半上实现快速排序,java,arrays,quicksort,Java,Arrays,Quicksort,我有一个练习,我必须改进算法。该算法采用一个数组,将偶数放在左侧(排序),赔率放在右侧(未排序)。 算法效率很低,所以我必须改进它 这是练习的原始代码,我必须“改进”: public void what(int[]arr){ 内部温度; 对于(int i=0;i0;j--) arr[j]=arr[j-1]; arr[0]=温度; } } 我想在这个练习中实现快速排序算法,但问题是我不知道如何使用枢轴:通常,枢轴是中位数,数组的数字一半较小,另一半较大 这里的问题是,左边的部分必须是偶数,右边的

我有一个练习,我必须改进算法。该算法采用一个数组,将偶数放在左侧(排序),赔率放在右侧(未排序)。 算法效率很低,所以我必须改进它

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

public void what(int[]arr){
内部温度;
对于(int i=0;i0;j--)
arr[j]=arr[j-1];
arr[0]=温度;
}
}
我想在这个练习中实现快速排序算法,但问题是我不知道如何使用枢轴:通常,枢轴是中位数,数组的数字一半较小,另一半较大

这里的问题是,左边的部分必须是偶数,右边的部分是赔率

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

有什么想法吗


谢谢大家!

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

建议一:线性通过数组,并将其拆分为两个偶数元素和奇数元素。这需要θ(n)时间。在进行线性扫描时,检查每个元素,可以找出最大的元素和最小的元素。然后可以对偶数整数数组实现计数排序。计数排序示例:

计数排序运行时间是O(n)摊销的,所以算法的总体运行时间是O(n)


建议二:如果你想使用快速排序,威胁每一个奇数值为+infinity,它自然会出现在列表的末尾,而不进行比较。如果您碰巧选择了奇数轴,请将其放在末尾,然后重试。我建议使用随机轴,而不是第一个/最后一个。

正如@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;

    }

谢谢你的建议。

到目前为止你试过什么?你有没有关于你正在编写代码来解决这个问题的具体问题?有一个名为
what
@marounnaroun-大学考试奇迹的方法很奇怪:)@Alan这就解释了它;)@我还没有取得这么大的进步。我当然不想要一个代码解决方案,只是一个不同算法的想法。这听起来很有趣,但快速排序已经是O(nlogn)了,这样我就可以在数组中添加另一个时间。它比O(n^2)更有效吗?六羟甲基三聚氰胺六甲醚。。。它仍然是O(nlogn),对吗?考虑到你没有额外的空间,在最坏的情况下(当所有元素都是偶数时),这将需要nlogn。话虽如此,我不明白如何避免它,因为您希望对这些元素进行排序,而这些元素没有任何特定的行为(可以是任何整数)。我的观点是,一天结束后,你必须应用排序,这将花费大量的时间。试着理解:)1)由于输入可以是任意范围(我的假设,因为问题没有说明输入的范围),你认为使用计数排序是一个好主意吗。2) 我不知道你们想说什么,据我所知,你们想对完整数组进行快速排序,当你们只需要对偶数进行排序时,为什么要这样做?很抱歉,回复太晚了。。正如我所说,为了使用计数排序,你必须知道范围。将阵列拆分为奇数部分和偶数部分将始终涉及通过阵列的线性传递,这使得在不增加额外计算成本的情况下识别范围成为可能。使用快速排序而不进行拆分的建议是因为您可以只对偶数元素进行排序,而不必首先进行额外的识别工作。
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;

    }
quicksort(arr,0,i);