我知道最佳和平均时间是O(n log(n)),最差时间是O(n ^ 2)。在这个特定的实现中,这些案例何时实际发生时,谁能告诉我?它在其他实现中有何不同?
private void quickSort(int low, int high) {
int i = low, j = high;
// Get the pivot element from the middle of the list
int pivot = array[low + (high - low) / 2];
// Divide into two lists
while (i <= j) {
// If the current value from the left list is smaller then the pivot
// element then get the next element from the left list
while (array[i] < pivot) {
i++;
}
// If the current value from the right list is larger then the pivot
// element then get the next element from the right list
while (array[j] > pivot) {
j--;
}
// If we have found a values in the left list which is larger then
// the pivot element and if we have found a value in the right list
// which is smaller then the pivot element then we exchange the
// values.
// As we are done we can increase i and j
if (i <= j) {
swap(array, i, j);
i++;
j--;
}
}
// Recursion
if (low < j)
quickSort(low, j);
if (i < high)
quickSort(i, high);
}
任何反馈都非常感谢。
答案 0 :(得分:0)
最糟糕的情况发生在您选择一个枢轴时,在“划分为两个列表”部分之后,最终会出现在阵列的一个极端(最左侧或最右侧)。原因是:两个递归调用中的一个将完成几乎没有工作,而另一个将几乎完成所有工作。
例如:您对1到100之间的数字进行排列,并在中间选择一个数据透视表。假设枢轴为1.您运行“划分为两个列表”部分,现在您必须对左侧的0个元素和右侧的99个元素进行排序。
最好的情况是当枢轴分成两个列表的一半时(在排列示例中,当你选择一个大约50的枢轴时)。