【发布时间】:2017-06-02 14:19:27
【问题描述】:
方法 1
C.A.R Hoare 介绍了在学校教授的划分逻辑(如下所示),
low = pivot = 0;
i = 1;
j = high = listSize-1;
while (true) {
while (a[i] <= a[pivot] && (i < high)) {
i = i + 1;
}
while (a[j] >= a[pivot] && (j > low)) {
j = j - 1;
}
if (i >= j)
break;
swap(a[i], a[j])
}
swap(a[j], a[pivot]); // pivot element is positioned(once)
return j;
方法2
基本上尝试使其稳定排序,而不是j指向最后一个索引(listSize-1),如果j指向listSize/2(即mid),那么,
我们遇到j > high 或i >= mid 的场景,其中a[i] 没有对应的a[j] 可与之交换,反之亦然。在这种情况下,将a[i] 与a[pivot] 交换也没有意义,这看起来是一种不正确的方法,确认一下,
我的问题:
采用方法 2,
通过保持快速排序的本质,我们不能用枢轴元素(在任何索引处)进行分区吗?
注意:分析快速排序,而不是家庭作业
【问题讨论】:
-
顺便说一句,我的印象是修改快速排序以使其稳定可能会牺牲足够的 quick 部分,因此最好使用自然稳定的排序。
-
@Hurkyl 牺牲quick是什么意思?我从来没想过这个算法中quick的含义
-
快速排序很受欢迎,因为它往往比其类别中的其他算法(如合并排序和堆排序)运行得更快。但它的优势并不是很大——如果你让快速排序做更多的工作,你很容易失去这种优势。而且我希望使快速排序稳定所需的工作足以失去优势。
-
任何排序都可以变得稳定,但代价是使用更复杂的比较。如果您的比较通过比较原始索引来打破平局,那么排序将是稳定的。
-
@Hurkyl 快速排序比合并排序快,尽管在快速排序中
compare()比合并排序要快 39%。因为,更少的swap()操作发生在快速排序中。在机器级别,swap()比compare()更昂贵。
标签: c algorithm sorting quicksort