选择
思路:
第一次从待排序的元素中选出最小的(最大)的一个元素,存放在起始位置 然后从未排序的元素中寻找最小(最大)元素,以此类推
5312
i=0 最小为1,1 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), 稳定