选择排序

一、原理

       ☆思想:每次选出最小值,作为无序集合首元素,最终得到递增序列;

       ☆过程:以递增为例,用数组表示,长度为n,整个数组为无序集合;从首元素开始循环,记录首元素索引作为最小值索引,后续每个元素都和最小值索引对应元素相比,如果小于则记录该元素索引为最小值索引,直到最后一个元素,交换首元素和最小值索引对应元素,首元素就是最小元素,除首元素外数组为无序集合;

                    再从第二个元素开始循环,直到最后一个元素,第二个元素就是无序集合最小值;反复循环,每次获得剩余元素中的最小值,最终数组为升序;

二、实现代码

      JavaScript 代码实现

function SelectSort(arr) {
    var minpos, temp;
    for (var i = 0; i < arr.length - 1; i++) {
        minpos = i;
        for (var j = i + 1; j < arr.length; j++) {
            if (arr[minpos] > arr[j]) {
                minpos = j;
            }
        }
        if (minpos != i) {
            temp = arr[i];
            arr[i] = arr[minpos];
            arr[minpos] = temp;
        }

        console.log(i + '.:' + arr);
    }
}

三、优化

       网上看到如下方法,每次循环得到最小和最大值,减少了循环,但比较和交换次数并没有减少,效率没有多少提升,仅供参考;

//原文链接:https://blog.csdn.net/zhangxiaoyu_sy/article/details/75000151
//如果在每一次查找最小值的时候,也可以找到一个最大值,然后将两者分别放在它们应该出现的位置,这样遍历的次数就比较少了
function SelectSortOpt(a) {
    var left = 0,
    right = a.length - 1;
    var min, max; //存储最小值、最大值的索引
    while (left <= right) {
        min = left;
        max = left;
        for (var i = left; i <= right; ++i) {
            if (a[i] < a[min]) min = i;

            if (a[i] > a[max]) max = i;
        }
        //交换left和min元素
        swap(a, left, min);
        //最左元素被交换到min,需要重新定位
        if (left == max) max = min;
        //交换right和max元素
        swap(a, right, max);

        ++left; --right;
        console.log(a);
    }
}
function swap(arr, i, j) {
    var temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

四、复杂度

名称 时间复杂度 空间复杂度  稳定性 
平均 最坏 最优
选择排序 O(n²) O(n²) O(n²)  O(1)

X

      最坏情况,数组反序,最小元素,需要进行n-1次比较,一次交换…第二大元素,需要进行1次比较,一次交换,共需要1+2+3+……+(n-1)=n(n-1)/2次比较,Math.floor(n/2)次交换;

      最优情况,数组正序,最小元素,需要进行n-1次比较,不用交换…第二大元素,需要进行1次比较,不用交换,共需要1+2+3+……+(n-1)=n(n-1)/2次比较,0次交换;

      本排序需要申请一个额外空间;

      使用数组表示,相同元素顺序可能变化,本排序不稳定。

posted @ 2019-11-22 23:10  老余的水壶  阅读(171)  评论(0)    收藏  举报