选择排序

·  阅读 71
选择排序

选择排序的原理

  • 暂且认为集合中第一个元素是最小的,记录最小元素的下标为第一个元素的下标,然后依次和右边的元素作比较,如果比记录元素小,那么就更新下标为该元素的下标,反之不变;遍历结束后就把第一个元素和最小下标值的元素交换位置;然后再第二个元素、第三个元素。。。依次执行上面的操作,直到把所有的元素查找一遍.

代码实现

初始版本代码

function sectionFun(arr){
    let tempArr = arr.slice();
    for(let j = 0; j < tempArr.length - 1; j++){
        let minIndex = j;
        for(let i = j; i < tempArr.length; i++){
            if(tempArr[i] < tempArr[minIndex]){
                minIndex = i;
            }
        }
        
        // 交换位置
        changeFun(tempArr, j, minIndex);
    }
}

// 交换函数
function changeFun(arr, i, j) {
  let temp = arr[i];
  arr[i] = arr[j];
  arr[j] = temp;
}
复制代码

优化版本

  • 构想: 每次都找到最小的和最大的,小的放左边,大的放右边
function sectionFun(arr){
    let tempArr = arr.slice();
    /*
        Math.ceil((tempArr.length - 1) / 2)
        因为是每次是找出最大的和最小的,所以遍历次数最多是长度的一般,为了保证准确性,向上取整
    */
    for(let j = 0; j < Math.ceil((tempArr.length - 1) / 2); j++){
        let minIndex = j;
        let maxIndex = tempArr.length - 1 - j;
        let lastIndex = tempArr.length - 1 - j;
        for(let i = j; i < lastIndex + 1; i++){
            if(tempArr[i] < tempArr[minIndex]){
                minIndex = i;
            }
            
            if(tempArr[i] > tempArr[maxIndex]){
                maxIndex = i;
            }
        }
        /*
            如果获取到的最大的位置为最小位置需要交换的下标,所以需要更换交换后的下标,否则会有问题,因为刚更换的最小值又被更换到了最大值那边了 比如 9和2
            ps: 1, 9, 7, 4,  2, 8, 5, 3, 6, 10
        */
        if (maxIndex == j) {
            maxIndex = minIndex
        }
        
        // 把大小的元素放到它该有的位置
        changeFuc(arr, j, minIndex);
        changeFuc(arr, lastIndex, maxIndex);
    }
}

// 交换函数
function changeFun(arr, i, j) {
  let temp = arr[i];
  arr[i] = arr[j];
  arr[j] = temp;
}
复制代码

算法效率

  • 时间复杂度: O(n), 最坏情况下仍为O(n^2)
  • 控件复杂度: O(1)
分类:
前端
标签:
分类:
前端
标签:
收藏成功!
已添加到「」, 点击更改