Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

快速排序 #2

Open
bigdots opened this issue Feb 7, 2018 · 0 comments
Open

快速排序 #2

bigdots opened this issue Feb 7, 2018 · 0 comments

Comments

@bigdots
Copy link
Owner

bigdots commented Feb 7, 2018

快速排序(Quicksort)是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要 Ο(nlogn)次比较。在最坏状况下则需要 Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他 Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。

快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。

算法步骤

  1. 从数列中挑出一个元素,称为 “基准”(pivot)
  2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
  3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

images

代码实现

Array.prototype.quickSort = function() {
    var len = this.length;
    if (len <= 1) {
        return this.slice(0);
    }
    var left = [];
    var right = [];
    var mid = [this[0]];
    // 排除掉基准
    for (var i = 1; i < len; i++) {
        if (this[i] < mid[0]) {
            left.push(this[i]);
        } else {
            right.push(this[i]);
        }
    }

    return left.quickSort().concat(mid, right.quickSort());
};

wiki

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant