七大排序–快速排序
动图演示
为了完成此要求,我在网上筛选了比较直观的图,便于理解,只是为记录学习目的(如有侵权,我会删除)
统计图式
直观递归
复杂度
代码
/**
*快速排序(从小到大排序)
*1.首先建立左右哨兵l=0,r=arr.length-1
*2.寻找基准位置(将元素放在合适的位置)
*3.基准值得设定有很多种,本篇采用以第一个数为基准值,进行快排---key=arr[l]=左哨兵
*4.首先从右哨兵开始向前搜索r--;将key与arr[r]进行比较,找到小于基准值得r,将arr[r]的值赋值给arr[l](左哨兵)
*5.左哨兵发现自己的值被替换,开始行动,向后进行比较找到值比key小的位置,并将左哨兵的值赋值给右哨兵
*6.循环4~5的步骤,直到l=r,遍历结束,此时就是基准值得位置
*7.基准值赋给当前位置
*8.以上面基准值为临界点,将其数组分为两部分,重复上述的排序过程
*9从而达到排序好的数组
*/
//返回基准位置
public static int getPosition(int[] arr,int i,int j)
{
//设置基准值
int key = arr[i];
while (i<j)
{
//从右开始比较
//当右哨兵的值一直大于key,就一直向前移动
while (i < j && arr[j] >= key)
{
j--;
}
//找到小于基准值的值,将右哨兵的值赋值给左哨兵且始终要保持左哨兵小于右哨兵
if (i < j)
{
arr[i] = arr[j];
}
//左哨兵向后移动,如果小于获等于key,一直向后移动
while (i < j && arr[i] <= key)
{
i++;
}
//找到比arr[j]值大的,将值赋给它
if (i < j)
{
arr[j] = arr[i];
}
}
//跳出循环,判断此时的情况应该是i=j,也就是正确的索引位置
arr[i] = key;
return i;
}
//采用递归快排
public static void QuickSort(int[] arr,int l,int r)
{
//dafault:key=arr[l]
if (l < r)
{
//分段的临界点
int demarcationPoint = getPosition(arr,l,r);
//递归YYDS!!
//左边排序递归
QuickSort(arr, l, demarcationPoint - 1);
//右边递归
QuickSort(arr, demarcationPoint + 1, r);
}
}