JS书写冒泡排序和快速排序

2016-09-26  本文已影响105人  恐怕是小珠桃子

冒泡排序

先说冒泡,这个原理最简单,其实一趟冒泡要做的事情就是“把最重的泡泡沉到底下去”,也就是一趟排序要找出最大的数,那怎么实现呢?用当前数字和下一个数字做比较,如果当前>下一个,进行值交换,自然就可以通过一次循环找到最大的数。
那么我们需要控制的就是循环次数,这个当然是用数组长度来控制,一趟冒泡后,循环次数减一,看下面一段代码:

function bubbleSort(arr) {
    const end = arr.length - 1;

    for (let i = end; i >= 0; i--) {
        let temp = 0;

        for (let k = 0; k < i; k++) {
            if (arr[k] > arr[k + 1]) {
                arr[k] = arr[k] + arr[k + 1] - (arr[k + 1] = arr[k]);
                temp = 1;
            }
        }
        if (temp == 0) {
            break;
        }
    }

    return arr;
}

我们可以看到,上面代码片段中设置了temp,它是用来做什么的呢?用于标记一次循环时是否发生了交换。也就是说,如果在一趟循环结束后,没有发生任何交换,也就是说现在已经是升序了,不需要再排了,可以结束了,这样就有效的降低了时间复杂度。

快速排序

快排的思想想必大家也都知道,在一次排序后,数字a的左边都是比它小的,右边都是比它大的。然后对左边和右边的数字做同样的操作。比如我们先选择第一个数a,然后对数组进行循环,遇到比a大的就不管,遇到比a小的就和上一个比a大的数进行交换,数组循环完毕后,将a与当前正在比对的值进行交换,就可以实现“左边<a<右边”,然后对左边右边的数据递归排序,具体代码如下:

function quickSort(arr, start, end) {
    let m = start;

    if (start >= end) {
        return;
    }

    for (let i = start + 1; i <= end; i++) {
        if (arr[i] < arr[start]) {
            m++;
            arr[i] = arr[i] + arr[m] - (arr[m] = arr[i]);
        }
    }

    arr[start] = arr[start] + arr[m] - (arr[m] = arr[start]);
    quickSort(arr, start, m - 1);
    quickSort(arr, m + 1, end);

    return arr;
}
上一篇 下一篇

猜你喜欢

热点阅读