Cel*_*tas 6 sorting algorithm recursion
我听说在quicksort中最好先在较小的子阵列上调用递归.例如,如果5是数据透视表并且数据被排序到4,1,3,5,7,6那么最好先对子数组进行排序,7,6因为它包含两个元素,其中4,1,3包含三个元素.
所有知识的来源都为快速排序提供了伪代码
quicksort(A, i, k):
if i < k:
p := partition(A, i, k)
quicksort(A, i, p - 1)
quicksort(A, p + 1, k)
Run Code Online (Sandbox Code Playgroud)
因此,首先实现在较小阵列上递归的算法看起来就像
quicksort(A, i, k):
if i < k:
p := partition(A, i, k)
if(p-i > k-p)
/*difference from start point to pivot is greater than
difference from pivot to end point*/
quicksort(A, p + 1, k)
quicksort(A, i, p - 1)
else
quicksort(A, i, p - 1)
quicksort(A, p + 1, k)
Run Code Online (Sandbox Code Playgroud)
我用这样的代码编写了用Java编写的代码,它确实看起来更快,但为什么呢?起初我认为它与尾递归优化有关,但后来意识到由于Java不支持它,因此确实是错误的.
为什么要先将较小的子代码中的代码排序更快?这篇文章声称它应该是
小智 0
Java JIT 编译器可以消除尾递归,从而减少堆栈内存的使用。减少的堆栈内存可以减少缓存压力,从而允许更大的分区大小适应更快的缓存级别。
其他小的改进是减少了函数调用的数量。那些执行的指令数量略有减少。但是,当操作不适合缓存的数据时,指令数减少通常与性能的相关性非常低。