zoukankan      html  css  js  c++  java
  • 排序算法(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);
            };
    

    六.效率分析:

  • 相关阅读:
    3(翻译)如何在cocos2d里面使用动画和spritesheet
    Objectivec2.0 每种数据类型定义属性的方法
    cocos2d 入门必备4个基本概念
    如何在Mac上搭建自己的服务器——Nginx
    JN_0001:在微信朋友圈分享时长大于10s的视频
    JN_0002:Win10禁止U盘拷贝文件的方法
    abstract class 和 interface区别
    ref和out
    .Net配置错误页
    Unity3d 物体沿着正七边形轨迹移动
  • 原文地址:https://www.cnblogs.com/jackson1/p/12711437.html
Copyright © 2011-2022 走看看