每日一题-- 快速排序算法

50 阅读1分钟

🙇‍♂️ 前序:昨天做628的时候,求数组中最大三个数的乘积,感觉很简单,想着要不自己写一个数组排序的方法吧,好久没有做过类似数组排序的算法题了,结果一动手发现冒泡忘记了,然后看了一下动图才想起来。然后想着用快排,平时也听得比较多的一种排序算法。结果我是看动图都没看懂,感觉上学的知识点全忘了。今天就上快排教程吧

20200806092526691.gif

ps: 如果还有印象的同学可以先看图回忆一点

🪶 快排定义: 先在数组中定义一个target目标,一般取第一个,然后定义一个左指针指向数组头部,一个右指针指向数组尾部,然后比较右指针的数组是否比target值小,如果是就将右指针指向的值复制到左指针的位置上,左指针继续向后前进一步,找到一个值比target值大的值填充到右指针上,然后右指针向前走,去找值…一直重复下去,直到左右指针指向相同位置时把target放到目标值,然后再递归target左右两边的数组,直到左右数组的长度只有1时,停止递归。

function fastSort (nums, left, right) {
        let target = nums[left]
        let l = left
        let r = right
        while (l < r) {
          while (l < r && nums[r] >= target) {
            r--
          }
          if (l < r && nums[r] < target) {
            nums[l] = nums[r]
            l++
          }
          while (l < r && nums[l] <= target) {
            l++
          }
          if (l < r && nums[l] > target) {
            nums[r] = nums[l]
            r--
          }
        }
        nums[l] = target
        if (l -left > 0) {
          fastSort(nums, left, l - 1)
        }
        if (right - r > 0) {
          fastSort(nums, r + 1, right)
        }
      }