1. 冒泡排序
中心思想:數(shù)組內(nèi)數(shù)值,從左向右兩兩依次比較,挑出最大值,并向后移動,移動結(jié)果,移動一輪最大值總能出現(xiàn)在數(shù)組最后(冒泡)
算法主要的邏輯
第一輪:數(shù)組內(nèi)第一個和第二個依次比較,無論結(jié)果怎樣,第二個和第三個比較,直至第n個(n為數(shù)組長度),比較了n-1次,倒數(shù)第一個數(shù)。
第二輪:數(shù)組內(nèi)第一個和第二個依次比較,無論結(jié)果怎樣,第二個和第三個比較,直至第n-1個。比較了n-2次,比較的末尾是倒數(shù)第二個數(shù)
第三輪:---
第n+1輪: ---
所以我們需要的變量有, 描述總共需要多少輪的變量i ,一輪需要比較多少次的變量j,我們忽視的無論結(jié)果(需要準備一個交換位置的函數(shù))。 其中變量a 和,變量b ,均和數(shù)組的長度有關系。
i的行為: 從 0 增加 到 arr.length, 那么很簡單,for循環(huán)。
j的行為:從0增加到arr.length for循環(huán)
i和j 關系: i=0 ,執(zhí)行 j 從0 到 arr.length-1; 所以,應該是 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ù)的時候,不允許有j+1這樣的變量,同時,如果我們傳進去的是非引用類型, 那么賦值是無效的。
2.選擇排序
中心思想:把數(shù)組內(nèi)的第一個值與其他值依次比較,直到發(fā)現(xiàn)比第一個值還小的值,記錄這個小的值,再與其他值比較,一輪結(jié)束,總能選則出最小值與第一個值交換位置。
主要邏輯:[a,b,c,d,e]
第一輪:把第一個數(shù)當做最小值,最小值分別和第二個數(shù)比較,無論結(jié)果怎樣,最小值與第三個數(shù)比較,。。。。直到第n個,比較了n-1次。比較的末尾是最后一個數(shù),交換最小值與第一個值的位置。
第二輪:從第二個值開始,重復上面的步驟。 比較次數(shù),n-2次,比較的最后一次仍然是末尾。交換min與第二個值的位置。
第n輪:從第n個值,重復上面的步驟。比較次數(shù)0次。交換n與第n個數(shù)。
所以,我們需要的變量有 輪數(shù)i ,次數(shù)j ,最小值min或者記錄最小值的位置indexofmin,一個交換位置的函數(shù)。
i的行為:從0增加到arr.length, 為什么是arr.length(假設有5個數(shù),每輪挑選出最一個最小值,要選幾輪才能選完?)
j的行為:從i+1一直比較到arr.length ,從i+2一直比較到arr.length...
i與j的關系,首先還是嵌套.
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.插入排序
中心思想:類似于起牌,把第一個數(shù),當起的第一張牌,把第二個數(shù)當起的第三張牌,然后插到合適的位置。
主要邏輯
第一輪:起第一張牌
第二輪:起第二張牌(數(shù)組第二個數(shù)),與第一張牌比大小,大的放在前面,小的放在后面。
第三輪:起第三張牌(數(shù)組的第三個數(shù)),先與第二張牌比較,大則不什么都不作,小則依次和第一張比較。。。
第n輪:起第n張牌,先與n-1比較。依次與第n-1張牌,n-2張牌比較,只要找到比n小的數(shù),記錄這個數(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))