学习语言的过程就是练习语言的过程。快速排序作为20世纪十大算法之一,看看使用lisp如何实现。在实现快速排序的时候,本文实现的三向快速排序。在较老的Unix系统中的qsort函数实际上存在毛病,即当待排序的数据中存在大量的重复数据,快速排序仍然需要执行很长的时间。这个bug在很久之后才被发现。随后Dijkstra提出三向快速排序算法,相对与传统的快速排序需要两个索引,三向快速排序需要三个索引。
传统快速排序的伪代码如下:
quick-sort主函数: quick_sort(array, start, end)
- 检测输入
- parition
- 递归调用左边
- 递归调用右边
partition函数的伪代码如下:partition(array, start, end)
- 选取pivot
- 若当前值(start位置)比pivot小,则++start,
- 若当前值(start位置)比pivot大,则向前索引end,直到发现比pivot小的数,然后交换,++start, --end;
- 当start>end时,交换pivot处的值和end处的值,返回partition的位置,end
- goto 步骤2
传统的快速排序并没有针对相等这种情况处理,其可以归结到左半边或者右半边。但是其违背了快速排序的想法,即每一步&