[英]What algorithm can I use to sort an array with the use pivots
让我通过使用示例(在Java中)更具体。
假设您要对此数组排序:
[10, 20, 30, 40, 50, 60, 70, 80, 90]
假设枢轴为30,在排序之后看起来应该像这样:
[40, 50, 60, 70, 80, 90, 30, 10, 20]
大于30的数字在30的左侧结束(虽然仍按最大排序),而小于30的数字在30的右侧(依序至少按最大排序)。
注意:假设数据集非常大,则不必具有确切的数组集。
现在这是我用伪代码提出的算法:
1). Count how many values are more than 30, call this count value 'X'. Swap the value of 30 at index X.
2). Have 2 "movers" that start on both ends, each moving towards the pivot and determining which numbers should go on what side
3). Use bubble sort on both sides of the pivot to finish the algorithm.
现在,这是我自己的算法存在的问题。 直到我进入冒泡排序为止,它是O(n),这使其变为O(n ^ 2)。
我的具体问题是:什么是对此更好的方法,并且仍将其保持为O(n)? 或者如果可能的话O(log n)? 答案可能是伪代码,但是您选择了答案的代码,我更喜欢使用Java。
注意:该数组是整数数组。 全部具有唯一值。
编辑:Mergesort显然是比冒泡排序更好的解决方案。 我的问题确实是为了寻找O(n)或O(log n)解决方案。
首先,如果您担心时间,为什么要使用气泡排序? 您可以做的第一件事是用像Merge Sort这样的算法替换冒泡排序 ,它的复杂度是O(n log n)
。
现在,我告诉您不可能用O(n)
或O(log n)
找到更好的解决方案,假设您找到了O(n)
甚至O(log n)
算法解决方案。 现在,您可以使用O(n)
对每个数组进行排序! 因为首先找到具有O(n)
的最小数组,然后将其用作数据透视表,然后再使用算法,所以现在您有了一个排序数组,复杂度为O(n)
,这是不可能的。 有关O(n log n)
更多信息,请参阅排序算法的“Ω(n log n)障碍”规则是什么?
您可以在此处找到排序算法的Java实现。
如果要以最简单的方式进行操作,请先以自然顺序对数组进行排序,然后旋转它。
public static void main(String[] args) {
int pivotValue = 3;
Integer[] array = { 6, 4, 7, 3, 9, 1, 2, 0, 5, 8 };
System.out.println(java.util.Arrays.toString(array));
java.util.Arrays.sort(array);
int pivotIndex = java.util.Arrays.binarySearch(array, pivotValue);
int pivotOffset = Math.abs(pivotIndex + 1);
java.util.List<Integer> list = java.util.Arrays.asList(array);
java.util.Collections.rotate(list, -pivotOffset);
if (pivotIndex > 0) {
list = list.subList(array.length - pivotOffset, array.length);
java.util.Collections.rotate(list, 1);
}
System.out.println(java.util.Arrays.toString(array));
}
二进制搜索为O(log n)
但排序和旋转为O(n)
因此总体复杂度为O(n log n)
(每个@brimborium进行了校正)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.