排序算法(06. 快速排序)

一.快速排序的重要性

1.快速排序几乎可以说是目前所有排序算法中,最快的一种排序算法。
当然,没有任何一种算法是在任何情况下都是最优的。
比如 希尔排序 确实在某些情况下可能好于快速排序。
但是大多数情况下,快速排序还是比较好的选择
2.快速排序被列为20世纪十大算法之一

二.什么是快速排序

三.快速排序过程图解

四.快速排序中枢纽(pivot)的选择

取 头 中 尾 三个数的中位数 作为枢纽

五.代码实现

//交换方法
        ArrayList.prototype.swap = function (i, j) {
          var temp = this.array[i];
          this.array[i] = this.array[j];
          tjhis.array[j] = temp;
        };

        //定义一个寻找枢纽的方法
        ArrayList.prototype.median = function (left, right) {
          var center = Math.floor((left + right) / 2);
          // 1.将找到的首, 中, 尾三个位置的数字按有小到大排序
          if (this.array[left] > this.array[center]) {
            this.swap(left, center);
          }
          if (this.array[center] > this.array[right]) {
            this.swap(center, right);
          }
          if (this.array[left] > this.array[center]) {
            this.swap(left, center);
          }
          // 2.把找到的枢纽,即中间位置的数,放到倒数第二个数的位置
          this.swap(center, right - 1);
        };
        //快速排序
        ArrayList.prototype.quickSort = function () {
          this.quick(0, this.array.length - 1);
        };
        //定义递归哈函数
        ArrayList.prototype.quick = function (left, right) {
          //递归出口
          if (left >= right) return;
          //找到枢纽
          var pivot = this.median(left, right);
          //进行交换操作
          var i = left;
          var j = right - 1;
          while (true) {
            while (this.array[++i] < pivot) {}
            while (this.array[--j] > pivot) {}
            if (left < right) {
              this.swap(i, j);
            } else {
              break;
            }
          }
          //把枢纽放到属于他的位置
          this.swap(i, right - 1);
          //利用分治思想
          this.quick(left, i - 1);
          rhis.quick(i + 1, right);
        };

六.效率分析:

原文地址:https://www.cnblogs.com/jackson1/p/12711437.html