Android每日一问,小聚成河,大聚成江。 更多请访问GitHub Android-Daily-Interview。 注:以下为我个人理解及与大家的回答整理,不定时更新最新回答。
快速排序是从冒泡排序演变而来的算法,但是其比冒泡排序要高效,所以叫做快速排序,简单理解如下。
我举个简单例子来理解吧:
比如我们即将排序的数组如下:
1 8 9 5 6 3 0
我们一般将首位 1 或者最后一个数字 0 认为是基准元素,然后左右对比,大致规律如下:
第一次 : 将 1 移出,从最右边 数字0 开始,如果 <= 基准数1,则将其移到左边第一个位置,此时 最右边的数字相当于被挖空。
如下,其中 — 代表被挖空的数字
0 8 9 5 6 3 —
接下来从左边开始,如果大于等于基准数1,则将移到右边刚才挖空的位置上,如下:
2 — 9 5 6 3 8
接下来继续从右边开始,刚才右边我们进行到3了,继续左移,如果遇到 <= 基准数 0,那么将其移到刚才 挖的 坑上,如果没有遇到,并且左右操作的数相同时,此时 将 基准数 移动到这个空着的坑位。
如下:
0 1 9 5 6 3 8
我们可以发现,基准数1左边的都小于其,右边的都大于其,所以两边各自继续按照刚才上面的逻辑继续递归。(虽然这里最左边只是0,可以忽略)
接下来的过程如下:
0 1 — 5 6 3 8 (基准数9)
0 1 8 5 6 3 —
0 1 8 5 6 3 9
0 1 — 5 6 3 9 (基准数8)
0 1 3 5 6 9 _
0 1 3 5 6 _ 9
0 1 3 5 6 8 9 (基准数6)
最后,再盗一张图,详细的看一下