zoukankan      html  css  js  c++  java
  • 快速排序

    快速排序又叫分治法。

    分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。

    利用分治法可将快速排序的分为三步:

    1. 在数据集之中,选择一个元素作为”基准”(pivot)。
    2. 所有小于”基准”的元素,都移到”基准”的左边;所有大于”基准”的元素,都移到”基准”的右边。这个操作称为分区 (partition) 操作,分区操作结束后,基准元素所处的位置就是最终排序后它的位置。
    3. 对”基准”左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。

    简单实现方式,并不友好,因为需要Ω(n)的额外存储空间,需要new N个数组进行保存,操作的不是原来的数组

    var quickSort = function(arr) {
      if (arr.length <= 1) { return arr; }
      var pivotIndex = Math.floor(arr.length / 2);
      var pivot = arr.splice(pivotIndex, 1)[0];
      var left = [];
      var right = [];
      for (var i = 0; i < arr.length; i++){
        if (arr[i] < pivot) {
          left.push(arr[i]);
        } else {
          right.push(arr[i]);
        }
      }
      return quickSort(left).concat([pivot], quickSort(right));
    };

    原地(in-place)分区版本,操作的是原来的数组

        
    function quickSort(array) {
        // 交换元素位置
        function swap(array, i, k) {
            var temp = array[i];
            array[i] = array[k];
            array[k] = temp;
        }
        // 数组分区,左小右大
        function partition(array, left, right) {
            var storeIndex = left;        
            var pivot = array[right]; // 直接选最右边的元素为基准元素
            for (var i = left; i < right; i++) {
                if (array[i] < pivot) {
                    swap(array, storeIndex, i);
                    storeIndex++; // 交换位置后,storeIndex 自增 1,代表下一个可能要交换的位置
                }
            }
            swap(array, right, storeIndex); // 将基准元素放置到最后的正确位置上
            return storeIndex;
        }
        function sort(array, left, right) {
            if (left > right) {
                return;
            }
            var storeIndex = partition(array, left, right);
            sort(array, left, storeIndex - 1);
            sort(array, storeIndex + 1, right);
        }
        sort(array, 0, array.length - 1);
        return array;
    }

    推荐原地分区版本,占用内存较少;递归思想用得恰到好处,以后想用递归实现需求的时候要多参考参考

  • 相关阅读:
    MQTT TLS 加密传输
    python多进程并发redis
    各种消息队列的特点
    mqtt异步publish方法
    Numpy API Analysis
    Karma install steps for unit test of Angular JS app
    reinstall bower command
    Simulate getter in JavaScript by valueOf and toString method
    How to: Raise and Consume Events
    获取对象的类型信息 (JavaScript)
  • 原文地址:https://www.cnblogs.com/oufeng/p/6366623.html
Copyright © 2011-2022 走看看