最近,我重新燃起了对排序算法的兴趣(这是一种从未真正消失的魅力),我一直在研究快速排序。最常见的学术版本的快速排序使用了一个分区,这是由于Nick Lomuto,它使用一个指针扫描arry,最后在中间使用分区元素,所有小于项在其左侧,所有大于项在其右侧,然后在两部分上递归;分区元素从来都不是快速排序中任何后续递归调用的一部分。
C.A.R.Hoare最初的分区算法的工作方式不同,使用两个指针而不是一个指针。一个指针从数组的左端开始,一直向前移动,直到找到一个不合适的项。另一个指针从数组的右端开始,一直移动到数组的左端,直到找到一个不合适的项。然后交换数组项,每个指针向另一个指针迈出一步,该过程继续,当两个指针交叉时停止,此时将进行最后的交换。Hoare的分区以返回右侧指针结束;指针左侧的所有项,加上指针本身的项,都小于指针右侧的所有项。分区元素位于左侧分区的某个位置,但不一定位于其末尾,这需要更改快速排序算法中的递归调用,其中包括分区元素。
您的任务是实现Hoare的分区,并使用它编写一个快速排序程序。完成后,欢迎您阅读或运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。
页:1 2