1. 冒泡排序
中心思想:數(shù)組內(nèi)數(shù)值,從左向右兩兩依次比較隐绵,挑出最大值缠局,并向后移動(dòng),移動(dòng)結(jié)果妈拌,移動(dòng)一輪最大值總能出現(xiàn)在數(shù)組最后(冒泡)
算法主要的邏輯
第一輪:數(shù)組內(nèi)第一個(gè)和第二個(gè)依次比較拥坛,無論結(jié)果怎樣,第二個(gè)和第三個(gè)比較尘分,直至第n個(gè)(n為數(shù)組長度)猜惋,比較了n-1次,倒數(shù)第一個(gè)數(shù)培愁。
第二輪:數(shù)組內(nèi)第一個(gè)和第二個(gè)依次比較著摔,無論結(jié)果怎樣,第二個(gè)和第三個(gè)比較定续,直至第n-1個(gè)谍咆。比較了n-2次,比較的末尾是倒數(shù)第二個(gè)數(shù)
第三輪:---
第n+1輪: ---
所以我們需要的變量有私股, 描述總共需要多少輪的變量i ,一輪需要比較多少次的變量j摹察,我們忽視的無論結(jié)果(需要準(zhǔn)備一個(gè)交換位置的函數(shù))。 其中變量a 和庇茫,變量b 港粱,均和數(shù)組的長度有關(guān)系。
i的行為: 從 0 增加 到 arr.length, 那么很簡單旦签,for循環(huán)查坪。
j的行為:從0增加到arr.length for循環(huán)
i和j 關(guān)系: i=0 ,執(zhí)行 j 從0 到 arr.length-1; 所以,應(yīng)該是 b循環(huán)宁炫,嵌套在a 循環(huán)內(nèi)部偿曙。
然后就可以寫函數(shù)了。
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))// 注意羔巢,命名函數(shù)的時(shí)候望忆,不允許有j+1這樣的變量,同時(shí)竿秆,如果我們傳進(jìn)去的是非引用類型启摄, 那么賦值是無效的。
2.選擇排序
中心思想:把數(shù)組內(nèi)的第一個(gè)值與其他值依次比較幽钢,直到發(fā)現(xiàn)比第一個(gè)值還小的值歉备,記錄這個(gè)小的值,再與其他值比較匪燕,一輪結(jié)束蕾羊,總能選則出最小值與第一個(gè)值交換位置喧笔。
主要邏輯:[a,b,c,d,e]
第一輪:把第一個(gè)數(shù)當(dāng)做最小值,最小值分別和第二個(gè)數(shù)比較龟再,無論結(jié)果怎樣书闸,最小值與第三個(gè)數(shù)比較,利凑。浆劲。。截碴。直到第n個(gè)梳侨,比較了n-1次。比較的末尾是最后一個(gè)數(shù)日丹,交換最小值與第一個(gè)值的位置走哺。
第二輪:從第二個(gè)值開始,重復(fù)上面的步驟哲虾。 比較次數(shù)丙躏,n-2次,比較的最后一次仍然是末尾束凑。交換min與第二個(gè)值的位置晒旅。
第n輪:從第n個(gè)值,重復(fù)上面的步驟汪诉。比較次數(shù)0次废恋。交換n與第n個(gè)數(shù)。
所以扒寄,我們需要的變量有 輪數(shù)i ,次數(shù)j ,最小值min或者記錄最小值的位置indexofmin,一個(gè)交換位置的函數(shù)鱼鼓。
i的行為:從0增加到arr.length, 為什么是arr.length(假設(shè)有5個(gè)數(shù)该编,每輪挑選出最一個(gè)最小值迄本,要選幾輪才能選完?)
j的行為:從i+1一直比較到arr.length 课竣,從i+2一直比較到arr.length...
i與j的關(guān)系嘉赎,首先還是嵌套.
min的行為: min的初始值,總是等于arr[i],然后循環(huán)開始于樟,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.插入排序
中心思想:類似于起牌迂曲,把第一個(gè)數(shù)靶橱,當(dāng)起的第一張牌,把第二個(gè)數(shù)當(dāng)起的第三張牌,然后插到合適的位置抓韩。
主要邏輯
第一輪:起第一張牌
第二輪:起第二張牌(數(shù)組第二個(gè)數(shù)),與第一張牌比大小鬓长,大的放在前面谒拴,小的放在后面。
第三輪:起第三張牌(數(shù)組的第三個(gè)數(shù))涉波,先與第二張牌比較英上,大則不什么都不作,小則依次和第一張比較啤覆。苍日。。
第n輪:起第n張牌窗声,先與n-1比較相恃。依次與第n-1張牌,n-2張牌比較笨觅,只要找到比n小的數(shù)拦耐,記錄這個(gè)數(shù)的位置插入。
所以见剩,我們需要的變量有輪數(shù)i杀糯,比較的次數(shù)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))