我发现了许多快速排序算法的实现,但最终我决定采用这个:
public static void quickSort(int array[], int start, int end)
{
if(end <= start || start >= end) {
} else {
int pivot = array[start];
int temp = 0 ;
int i = start+1;
for(int j = 1; j <= end; j++) {
if(pivot > array[j]) {
temp = array[j];
array[j] = array[i];
array[i] = temp;
i++;
}
}
array[start] = array[i-1];
array[i-1] = pivot;
quickSort(array, start, i-2);
quickSort(array, i, end);
}}
我有几个困惑。
为什么有些人建议以第一个元素作为枢轴点,而另一些人则建议选择中间元素,有些人则会认为你应该选择最后一个元素作为枢轴点,这不会有所不同吗?
假设我要解释为什么如果数组已排序,则快速排序的最坏情况增长阶数为O(n^2)。
我有以下数组:
{1, 2, 3, 4, 5, 6}。
如果我选择第一个元素作为枢轴元素,它不会将其与每个其他元素进行比较,然后仅将其与自身交换,仅需O(n)吗?然后它将继续进行两行代码,这两行代码是O(logn)
quickSort(array, start, i-2);
quickSort(array, i, end);
所以最终,即使它是整数排序列表,时间复杂度仍然是O(nlogn)吗?
如果我决定选择我的最后一个元素作为我的枢轴元素,那么它不会完全不同吗?它将交换6和1,因此它将执行与当枢轴元素是数组中第一个元素时完全不同的操作。
我只是不明白为什么最坏情况是O(n ^ 2)。
任何帮助将不胜感激!
end <= start || start >= end
?这两个表达式在什么情况下不等价? - Anton Sherwood