选择排序和插入排序

122 阅读1分钟

选择

思路:

第一次从待排序的元素中选出最小的(最大)的一个元素,存放在起始位置 然后从未排序的元素中寻找最小(最大)元素,以此类推

5312

i=0  最小为11 352 
i=1  最小为2  1 2 53
i=2  最小为3 1 2 3 5

说白了就是,将最值放到下标为0的位置,【1,len-1】此数组所有元素必定小(大)于【0】,重复操作
function sortArray(nums: number[]): number[] {
  let len = nums.length;
  if (len === 1) {
    return nums;
  }

  for (let i = 0; i < len - 1; i++) {
      //暂定最小的下标为i
      let minIndex = i;
      // 从i开始挨个跟最右边的对比
      for(let j = i+1;j < len;j++){
          if(nums[j] < nums[minIndex]){
            // 更改下标
            minIndex = j
          }
      }

      //判断下标是否是否变更,如果变了说明最小值不是nums[i]
        if(minIndex !== i){
        [nums[minIndex],nums[i]]=[nums[i],nums[minIndex]]
      }
  }

  return nums;
}

时间复杂度 O(n^2), 空间复杂度 O(1), 不稳定

插入

思路

默认第一个元素是已经排序的,取出下一个元素,在已排序的列表中挨个对比,找到对应的位置

5231
默认 5 已排序
i=1  j=1 nums[j]=2 < nums[j-1]=5
nums:[2531]  j--,j=0(break)

i=2 j=2 nums[j]=3 < nums[j-1]=5
nums:[2351] j--,j=1 nums[j]=3 > nums[j-1]=2(break)

i=3 j=3 nums[j]=1 < nums[j-1]=5
nums:[2315] j--,j=2 nums[j]=1 < nums[j-1]=3
nums:[2135] j--,j=1 nums[j]=1 < nums[j-1]=2
nums:[1235]
function sortArray(nums: number[]): number[] {
    let len = nums.length;
    if (len === 1) {
      return nums;
    }
    for(let i = 1; i<len;i++){
        //nums[j-1]就是已排序的那些元素,挨个和未排序数组的第一个元素凑成一对俩俩对比,直到未排序表长度为0
        for(let j = i;j > 0 && nums[j] < nums[j-1];j--){
            [nums[j],nums[j-1]] = [nums[j-1],nums[j]]
        }
    }
  
    return nums;
  }

时间复杂度 O(n^2), 空间复杂度 O(1), 稳定