基础排序算法优化

来源:互联网 发布:java int 除法取整 编辑:程序博客网 时间:2024/05/17 01:17

这篇博客,主要是最近学习算法导论时的一些收获,是关于直接选择排序,直接插入排序,二分查找的一些优化。

直接选择排序

数据结构课本上的直接选择排序就是每次选出一个最小的拿到最前面来:

function StraightSelectSort (arr) {    var i = 0,         len = arr.length - 1,        cur, k, j;    for (; i < len; i++) {        cur = arr[i];        k = i;        for (j = i + 1; j < len + 1; j++) {            if (cur > arr[j]) {                cur = arr[j];                k = j;            }        }        if (k !== i) {            arr[k] = arr[i];            arr[i] = cur;        }    }}

但是我们考虑一下,有没有可以优化的地方呢?既然我们每次都可以将最小的拿出来,那么是不是每次我们也可以将最大的拿出来呢?也就是说,我们需要在找最小的过程种同时进行找出最大的,并将最大的放到最后,这样我们时间复杂度就可以减少一半,下面来看代码:

function StraightSelectSort (arr) {    var left = 0,         right = arr.length - 1,        curR, curL, l, r;    while (left < right) {        l = left;        r = left;        curL = arr[left];        curR = arr[left];        for (var i = left + 1; i <= right; i++) {            if (arr[i] < curL) {                curL = arr[i];                l = i;            } else if (arr[i] > curR) {                curR = arr[i];                r = i;            }        }        if (l !== left) {            arr[l] = arr[left];            arr[left] = curL;        }        if (r !== left) {            arr[r] = arr[right];            arr[right] = curR;        }        // 数组进行收敛        left++;        right--;    }    return arr;}

直接插入排序

直接插入排序,是将一个数字插入到一个已经排好序的序列中,课本上的做法是,将这个数字与已经排好序的序列中的每一个数字进行比较,直到找出合适的位置:

function InsertionSort (arr) {    var key, i = 1, len = arr.length;    for (; i < len; i++) {        key = arr[i];        j = i - 1;        while (j >= 0 && arr[j] > key) {            arr[j + 1] = arr[j];            j--;        }        arr[j + 1] = key;    }    return arr;}

这里也有值得优化的地方,那就是找位置,我们假如采取二分查找的方法将位置找出来,这样就可以减少我们的比较的次数,从而对我们的算法进行一些优化:

function InsertionSort (arr) {    var key, i = 1, len = arr.length;    for (; i < len; i++) {        key = arr[i];        var index = BinaryFindPos(arr, i, key);        for (var j = i - 1; j >= index; j--) {            arr[j + 1] = arr[j];        }        arr[index] = key;    }    return arr;}function BinaryFindPos (arr, s, value) {    var left = 0,        right = s - 1,        mid;    while (left <= right) {        mid = (left + right) >> 1;        if (value >= arr[mid])            left = mid + 1;        else             right = mid - 1;    }    return left;}
0 0
原创粉丝点击