排序算法——快速排序
介绍
快速排序(Quick Sort)是对冒泡排序的一种改进。它运用到了分治思想,对每一个子序列分别排序。其平均时间复杂度为\(O(nlog(n))\),最坏时间复杂度为\(O(n^2)\)。虽然在时间复杂度上并没有显著的优势,但在实际运用中效率比同时间复杂度的一些算法要高。
实现
基本步骤
- 选取一个基元素,作为排序的对比标准,一般选取数组的第一个元素,也可以在中间随机选取。
- 选取左指针和右指针(数组的以一个元素索引和最后一个元素索引)。
- 先从大往小移动右指针,当指针所指元素小于基元素时,将此元素覆盖到左指针处(此时左指针处的元素由基元素备份,此位置视为一个坑,可覆盖,同理覆盖后此时的右指针位置成为一个坑,可由接下来的元素填充),然后左指针右移一位。
- 之后右指针不变从左往右遍历左指针,当左指针所指元素大于基元素时,将此元素填到右指针所指位置。
- 重复上面两个步骤直到左右指针相等,将基元素填在指针相等的位置,此时所有大于基元素的数都在其右边,所有小于基元素的数都在其左边。至此完成了一个排序。
- 对由基元素分割出来的两个数组再次按此步骤进行排序,一直递归下去,直至子数组的元素不需要排序(数组长度小于1)。
图解
将原数组中第一个元素作为基元素,同时设置左右指针。
移动移动指针,直到找到小于基元素的数(13),将其填入左指针位置,将左指针右移一位。
移动左指针,直到找到比基元素大的值(120),将其覆盖到右指针位置,右指针左移一位。
轮到右指针的轮次,移动右指针找到比基元素小的,显然120和40都比基元素20大,当左右指针重合时(数组索引为2),跳出循环,将基元素填入指针位置。
此时20的两边分别为小于其和大于其的数。对两个子数组,再次采用相同的方式来排序,直到所有元素排序完成。
最终排序完成数组为:
源码
1 | public class QuickSort { |
1 | def quick_sort(a, left, right): |