快速排序解析

快速排序

快速排序是递归分治排序数组的一种解决方案。

交换左右值排序

  1. 存在一个数组,Left指向当前数组的左边界,Right指向右边界,设置Left位置的值Value为比较值,比Value值大的放在数组的右侧,比Value值更小的值放在数组的左侧,最终就能确定Value值在数组中的位置 i, 继续对Left到i-1的子数组和i+1到Right的子数组进行重复操作,直到确认数组中所有值在数组中的位置。
    在这里插入图片描述
  2. 从右往左寻找比Value小的值,找到后,再从左往右查找比Value大的值,交换i, j 位置的值,继续遍历
    在这里插入图片描述
    在这里插入图片描述
  3. 当i,j 重合时,有两种情况,一种是 i 往右走碰到了 j ,因为我们是先从右往左遍历,那么此时 j 的值是找到了小于value的值,才有可能继续从 i 往右走找更大的值。另一种是 j 往 左走遇到了 i, 那么 i 有可能是上次交换后的位置,i 处的值 小于 value, 如果没有交换过,那么 此时 j 与 left 重合。我们交换 i 与 left 的值,则i位置左侧的值均小于left。
    如果我们先从左往右遍历,将存在一种情况,i 与 j 相遇,i, j 又没有交换过,也就是 当 i == right。 无法知道 right的值比value更大还是更小,需要再进行一次判断,所以建议是先从右往左查找更小值,在从左往右查找更大值。

在这里插入图片描述

代码示例

public void QuickSort( int[] nums, int left, int right )
    {
    
    
        if (left >= right) return;
        int value = nums[left];
        int i = left;
        int j = right;
        while( i < j )
        {
    
    
            while (i < j && nums[j] >= value) j--;
            while (i < j && nums[i] <= value) i++;
            Swap(nums, i, j);
        }

        Swap(nums, left, i);
        QuickSort(nums, left, i - 1);
        QuickSort(nums, i + 1, right);
    }
    // 异或表达式,交换两数值
    public void Swap( int[] nums, int i, int j )
    {
    
    
        if (i == j) return;
        nums[j] = nums[j] ^ nums[i];
        nums[i] = nums[j] ^ nums[i];
        nums[j] = nums[j] ^ nums[i];
    }

猜你喜欢

转载自blog.csdn.net/qq_25667669/article/details/127303979