冒泡排序
算法思想:通过一系列的“交换”动作完成的,首先第一个记录与第二个记录比较,如果第一个大,则二者交换,否则不交换;然后第二个记录和第三个记录比较,如果第二个大,则二者交换,否则不交换,以此类推,最终最大的那个记录被交换到了最后,一趟冒泡排序完成。在这个过程中,大的记录就像一块石头一样沉底,小的记录逐渐向上浮动。冒泡排序算法结束的条件是一趟排序没有发生元素交换。
- //冒泡排序
- Array.prototype.bubbleSort = function() {
- for (var i = this.length - 1; i > 0; --i)
- {
- for (var j = 0; j < i; ++j)
- if (this[j] > this[j + 1])
- this.swap(j, j + 1);
- }
- }
算法性能:最内层循环的元素交换操作是算法的基本操作。最坏情况,待排序列逆序,则基本操作的总执行次数为(n-1+1)*(n-1)/2=n(n-1)/2,其时间复杂度为O(n*n);最好情况,待排序列有序,则时间复杂度为O(n),因此平均情况下的时间复杂度为O(n*n)。算法的额外辅助空间只有一个用于交换的temp,所以空间复杂度为O(1)。
快速排序
算法思想:以军训排队为例,教官说以第一个同学为中心,比他矮的站他左边,比他高的站他右边,这就是一趟快速排序。因此,一趟快速排序是以一个枢轴,将序列分成两部分,枢轴的一边比它小(或小于等于),另一边比它大(或大于等于)。
- //递归快速排序
- Array.prototype.quickSort = function(s, e) {
- if (s == null)
- s = 0;
- if (e == null)
- e = this.length - 1;
- if (s >= e)
- return;
- this.swap((s + e) >> 1, e);
- var index = s - 1;
- for (var i = s; i <= e; ++i)
- if (this[i] <= this[e]) this.swap(i, ++index);
- this.quickSort(s, index - 1);
- this.quickSort(index +