美文网首页
快速排序步骤

快速排序步骤

作者: _菩提本无树_ | 来源:发表于2020-10-26 11:57 被阅读0次

效果图


3450630-103cc7c8c6ab5298.gif

其实上面的这个动图不了解原理的话看起来有点晦涩难懂,了解了就简单了,这个图可以放到最后看,现在解释太费劲了
先上代码

  mounted () {
    var arr = [6, 8, 12, 6, 7, 9, 3, 4, 19]
    this.quickSort(arr, 0, arr.length - 1)
  }
    // 快速排序,使用递归
    quickSort (arr, left, right) {
      console.log(arr)
      console.log(left + '/' + right)
      // 定义i和j的原因是下面需要使用这两个值确定下一个分组的递归左右边界
      let i = left
      let j = right
      // 不能使用0,因为arr永远是完整的数组,但是left是一直变的
      let key = arr[i]
      // 排序结束
      if (left >= right) {
        return
      }
      while (i < j) {
        // 当i<j,关键值小于从后面数的出现比key值小的数之前一直自减
        while (i < j && arr[j] >= key) {
          j--
        }
        // 这个时候key值是最小的,证明结束了
        if (i === j) {
          break
        }
        // 这里需要了解一下i++和++i是不一样滴
        arr[i++] = arr[j]
        while (i < j && arr[i] <= key) {
          i++
        }
        // 这个时候key值是最大的,证明结束了
        if (i === j) {
          break
        }
        // 这里需要了解一下j--和--j是不一样滴
        arr[j--] = arr[i]
      }
      arr[i] = key
      this.quickSort(arr, left, j - 1)
      this.quickSort(arr, j + 1, right)
    }

这里用的是递归的方式,因此会执行多遍,这里介绍只介绍第一轮递归,后面的与本次一样
var arr = [6, 8, 12, 6, 7, 9, 3, 4, 19]
定义三个值
第一个i,i代表的是最左侧值的下标.var i = 0
第二个j,j代表的是最右侧值的下标.var j = arr.length - 1
第三个key值,默认取最左侧的值 var key = arr[i] = 6

接下来就是费脑环节了,仔细一步步的跟着思路走,

(1)先从右侧起寻找比key(6)小的值,如果没有j--,再进行下轮寻找,可以找到j = 7, i = 0时 4 < 6停止循环
执行操作(i++先赋值在增1)
arr[i++] = arr[j]
即arr[1] = 4
arr = [4, 8, 12, 6, 7, 9, 3, 4, 19]

(2)接下来从左侧寻找比key(6)大的值,如果没有i++,再进行下轮寻找,可以找到当i = 1,j = 7时 8 > 6停止循环
执行操作(j--先赋值再减1)
arr[j--] = arr[i]
即arr[7] = 8
arr = [4, 8, 12, 6, 7, 9, 3, 8, 19]

(3)继续循环
此时i = 1,j = 6
从右侧寻找比key(6)小的值,可以找到i = 1,j = 6时 3 < 6,停止循环
执行操作
arr[i ++] = arr[j]
arr[1] = arr[6]
arr = [4, 3, 12, 6, 7, 9, 3, 8, 19]

(4)此时i = 2,j = 6
从左侧找比key大的值,找到 i = 2,j = 6 时12 > 6,停止循环
执行操作
arr[j --] = arr[i]
arr[6] = arr[2]
arr = [4, 3, 12, 6, 7, 9, 12, 8, 19]

(5)此时i = 2,j = 5
从右侧开始寻找比key小的值
发现直到i === j 即 2 === 2时也没找到,所以第一轮递归结束
此时设置arr[i] = key,arr[2] = 6
arr = [4, 3, 6, 6, 7, 9, 12, 8, 19]

(6)接下来就是将数组形式上分割成两部分,分别递归
this.quickSort(arr, left, j - 1)
this.quickSort(arr, j + 1, right)

this.quickSort(arr,0,1) [4, 3]
this.quickSort(arr, 3, 8) [6, 7, 9, 12, 8, 19]

依次进行下去即可,不信的话可以按照上面的方式继续推导
下面写一下(arr,0,1)接下来的过程,仔细观察
原始数据 arr = [4, 3, 6, 6, 7, 9, 12, 8, 19]

(1)[4, 3]
定义三个值
第一个i,i代表的是最左侧值的下标.var i = left = 0
第二个j,j代表的是最右侧值的下标.var j = j - 1 = 1
第三个key值,默认取最左侧的值 var key = arr[i] = 4
从右侧找比4小的值,发现第一个就是于是执行
arr[i++] = arr[j]
arr[0] = arr[1]
于是数组变成了
arr = [3, 3, 6, 6, 7, 9, 12, 8, 19]
i = 1

(2)接下来从左侧开始找比key大的值,此时发现i === j
所以终止循环执行arr[i] = key
arr[1] = 4
arr = [3, 4, 6, 6, 7, 9, 12, 8, 19]
好了这半个就结束了

下一个就是[6, 7, 9, 12, 8, 19]这半个的操作了,重复以上操作即可

个人觉得想法简单,但是转化为代码就得费点心了.可以在纸上写出来,然后就简单了

相关文章

  • 快速排序

    最近看了算法图解这本书,讲讲里面的快速排序: 快速排序的精髓在于 基准值和分而治之思想; 快速排序的基本步骤: 选...

  • 读书打卡<<算法图解-第四章>>>

    快速排序 递归计算阶乘 快速排序 快速排序的步骤 1.找出基准条件,基准值将直接影响排序的速度 2.O(log n...

  • 快速排序步骤

    效果图 其实上面的这个动图不了解原理的话看起来有点晦涩难懂,了解了就简单了,这个图可以放到最后看,现在解释太费劲了...

  • 排序算法

    概述 常用排序算法 冒泡排序 插入排序 选择排序 归并排序 快速排序 冒泡排序 步骤 比较相邻元素,如果前面元素比...

  • 快速排序

    快速排序 快速排序是最常用的排序算法 它的复杂度为 快速排序的步骤 从数组仲选择中间一项作为主元 创建两个指针左边...

  • 排序算法

    常见的排序算法 常见的排序算法有:插入、希尔、选择、冒泡、归并、快速、堆排序。。。 插入排序 算法步骤一、从数组的...

  • 常见简单算法

    快速排序 快速排序算法其实很简单,采用分治策略。步骤如下: 选取一个基准元素(pivot) 比pivot小的放到p...

  • 快速排序

    一.什么叫快速排序? 二.排序步骤: 对下列数组进行排序:(22,36,4,51,36,8,44,5,62,14,...

  • 利用JavaScript实现快速排序算法及步骤详解

    javascript实现快速排序算法:快速排序基本思想:使用分治法策略来把一个序列分为两个子序列 步骤为:1.从数...

  • 快速排序

    快速排序算法基本思想:对于输入的子数组a [ p : r ] ,按以下三个步骤进行排序。分解(Divide): 以...

网友评论

      本文标题:快速排序步骤

      本文链接:https://www.haomeiwen.com/subject/slqamktx.html