排序
1. 冒泡排序
-
中心思想:数组内数值,从左向右两两依次比较,挑出最大值,并向后移动,移动结果,移动一轮最大值总能出现在数组最后(冒泡)
-
算法主要的逻辑
第一轮:数组内第一个和第二个依次比较,无论结果怎样,第二个和第三个比较,直至第n个(n为数组长度),比较了n-1次,倒数第一个数。
第二轮:数组内第一个和第二个依次比较,无论结果怎样,第二个和第三个比较,直至第n-1个。比较了n-2次,比较的末尾是倒数第二个数
第三轮:---
第n+1轮: ---
所以我们需要的变量有, 描述总共需要多少轮的变量i ,一轮需要比较多少次的变量j,我们忽视的无论结果(需要准备一个交换位置的函数)。 其中变量a 和,变量b ,均和数组的长度有关系。
i的行为: 从 0 增加 到 arr.length, 那么很简单,for循环。
j的行为:从0增加到arr.length for循环
i和j 关系: i=0 ,执行 j 从0 到 arr.length-1; 所以,应该是 b循环,嵌套在a 循环内部。
然后就可以写函数了。
function maopao(arr){
for(var i=0;i<arr.length;i++){
for(var j=0;j<arr.length-1-i;j++){
if(arr[j]<=arr[j+1]){
}else{
replace(arr,j)
}
}
}
return arr
}
function replace(arr,j){
var middle= arr[j]
arr[j]=arr[j+1]
arr[j+1]=middle
}
var a=[2,8,3,32,4,9,4,8]
console.log(maopao(a))// 注意,命名函数的时候,不允许有j+1这样的变量,同时,如果我们传进去的是非引用类型, 那么赋值是无效的。
2.选择排序
-
中心思想:把数组内的第一个值与其他值依次比较,直到发现比第一个值还小的值,记录这个小的值,再与其他值比较,一轮结束,总能选则出最小值与第一个值交换位置。
-
主要逻辑:[a,b,c,d,e]
第一轮:把第一个数当做最小值,最小值分别和第二个数比较,无论结果怎样,最小值与第三个数比较,。。。。直到第n个,比较了n-1次。比较的末尾是最后一个数,交换最小值与第一个值的位置。
第二轮:从第二个值开始,重复上面的步骤。 比较次数,n-2次,比较的最后一次仍然是末尾。交换min与第二个值的位置。
第n轮:从第n个值,重复上面的步骤。比较次数0次。交换n与第n个数。
所以,我们需要的变量有 轮数i ,次数j ,最小值min或者记录最小值的位置indexofmin,一个交换位置的函数。
i的行为:从0增加到arr.length, 为什么是arr.length(假设有5个数,每轮挑选出最一个最小值,要选几轮才能选完?)
j的行为:从i+1一直比较到arr.length ,从i+2一直比较到arr.length...
i与j的关系,首先还是嵌套.
min的行为: min的初始值,总是等于arr[i],然后循环开始,min不停的与arr[j]比较,如果大于arr[i]则被重新赋值。
function selectMin(arr){
for(var i=0;i<arr.length;i++){
var min=a[i]
var indexofmin=i
for(var j=i+1;j<arr.length;j++){
if(min<=a[j]){
}else{
min=a[j]
indexofmin=j
}
}
replace(arr,i,indexofmin)
}
return arr
}
function replace(arr,i,indexofmin){
var middle=arr[i]
arr[i]=arr[indexofmin]
arr[indexofmin]=middle
}
var a=[15,7,9,32,45,1,0,77,54]
console.log(selectMin(a))
3.插入排序
-
中心思想:类似于起牌,把第一个数,当起的第一张牌,把第二个数当起的第三张牌,然后插到合适的位置。
-
主要逻辑
第一轮:起第一张牌
第二轮:起第二张牌(数组第二个数),与第一张牌比大小,大的放在前面,小的放在后面。
第三轮:起第三张牌(数组的第三个数),先与第二张牌比较,大则不什么都不作,小则依次和第一张比较。。。
第n轮:起第n张牌,先与n-1比较。依次与第n-1张牌,n-2张牌比较,只要找到比n小的数,记录这个数的位置插入。
所以,我们需要的变量有轮数i,比较的次数j ,以及记录中间最小值的indexmin。
i的行为:从0到arr.length
j的行为:每轮从i-1开始,与i比较。
indexmin的行为:初始值均为i,记录 i 或[j-1]~[0](也就是最小值)的位置。
function insert(arr){
for(var i=1;i<arr.length;i++){
var indexofinsert=i
console.log(1)
for(var j=i-1;j>-1;j--){
if(a[i]>a[j]){
}else{
indexofinsert=j
}
}
replace(arr,i,indexofinsert)
}
return arr
}
function replace(arr,i,indexofinsert){
arr.splice(indexofinsert,0,arr[i])
arr.splice(i+1,1)
}
var a=[0,23,4]
console.log(insert(a))