我有一个练习,我必须改进算法。这个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)的效率实现这种“排序”。
有什么想法吗?
谢谢!
答案 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);
感谢您的建议。