排序算法 互动版

在线工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器

快速排序算法思想

设当前待排序的无序区为 a[low..high],在 a[low..high]中任选一个记录作为基准(pivot),以此基准将当前无序区划分为左、右两个较小的子区间 a[low..pivot-1]和 a[pivot+1..high],并使左边子区间中所有记录的关键字均小于等于基准记录(不妨记为 pivot)的关键字 pivot.key,右边的子区间中所有记录的关键字均大于等于 pivot.key,而基准记录 pivot 则位于正确的位置(pivot)上,它无须参加后续的排序。通过递归调用快速排序对左、右子区间 a[low..pivot-1]和R[pivot+1..high]快速排序。


一趟快速排序的过程:

  • 1.设置两个变量i、j,排序开始的时候:i=0,j=N-1;

  • 2.以第一个数组元素作为关键数据,赋值给key,即key=A[0];

  • 3.从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换;

  • 4.从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;

  • 5.重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。


例子,数组a[46,30,82,90,56,17,95,15]

query

数组分成了两部分左边[15,30,17]小于基数46,右边[56,90,95,82]大于基数46。递归左右两边子数组。


快速排序算法平均时间复杂度O(nlgn),最坏O(n^2)。快速排序需要栈空间来实现递归,如果数组按局等方式被分割时,则最大的递归深度为 log n,需要的栈空间为 O(log n)。最坏的情况下在递归的每一级上,数组分割成长度为0的左子数组和长度为 n - 1 的右数组。这种情况下,递归的深度就成为 n,需要的栈空间为 O(n)。快速排序不是稳定排序算法。