冒泡排序:
第一轮遍历数组,比较两个相邻的元素,把大的交换到后边,这样第一轮下来,最后一个位置就是最大的元素。
第二轮遍历数组,还是从索引0开始比较相邻位置的元素,把大的换到后边,但是不用管最后一个位置的元素,因为它在上一轮已经定好了位置,不需要浪费比较次数了。这样第二轮下来,倒数第二个位置就是第二大的元素。
以此类推。所以需要双重循环。
外层循环控制一共要遍历多少轮,每一轮的结果是确定好一个位置的元素,所以假如一共有5个元素,5个坑,从最后一个坑开始,一直到正数第二个坑,要确定四个坑,因为正数第二坑定好了,那第一个位置自然就是被剩下的最小的那个了。所以外层要循环 数组长度-1 次。
内层循环是每次从i=0的位置开始,比较它和后一个位置元素的大小。每一轮外层循环里,内层要循环的次数是不一样的,因为内层要比较的次数越来越少 ,这与外层循环的控制次数有关。具体可以举例。
function sort(array){
for(let i=1;i<array.length;i++){
for(let j=0;j<array.length-i;j++){
if(array[j]>array[j+1]){
let temp=array[j]
array[j]=array[j+1]
array[j+1]=temp
}
}
}
return array
}
插入排序
类似于整理扑克牌,每次拿到一张牌,把它插入到合适的位置,从第一张只有一张牌,是自然有序的,以后每拿到一张,就插入到合适的位置,所以每次都是把当前牌插入到一个有序数组里。
所以把数组i=0项看成是自然有序的,遍历数组从i=1开始的所有项。把当前项i插入到之前的有序数组里,具体:从j=i-1开始,一直遍历到j=0,每一项都和当前项i比较,如果比当前项大,那就把j的元素换到后边,覆盖到j+1的位置;然后j往前走,直到有一次当前项更大,就跳出里层循环,找到了当前项应该插入的位置。即把j+1的位置覆盖为当前项
function sort(arr){
for(let i=1;i<arr.length;i++){
let target=arr[i]
for(var j=i-1;j>=0;j--){
if(arr[j]>target){
arr[j+1]=arr[j]
}else{
break
}
}
arr[j+1]=target
}
return arr
}