我覺得作為前端學學演算法也是有益處的吧,所以今天就先來講講最基礎的排序演算法。提公升我們程式設計師的內功~
插入排序是n^2的基礎排序方法,大致思想是假設乙個陣列的前n個元素已經有序,然後考慮把第n+1個未排序的元素給插入到有序陣列中去。現將n+1和第n個元素比較,如果n+1比n小,那麼就交換一下位置。之後我們要排序的元素就在n這個位置上了,接著我們繼續比較n和第n-1個元素的大小。如此反覆,直到我們要插入的元素找到適合他的位置。
下面來示範一下
6--7--8--9--3--1--4--6--3--8--9--5
6--7--8--9已經有序,我們要插入的元素是n=4這個元素3。比較9和3的大小,9比3大。交換一下位置
6--7--8--3--9,就變成了這個樣子。接著比較8和3的大小,8比3大,交換一下位置
6--7--3--8--9,繼續比較7和3的大小,7比3大,交換一下位置
6--3--7--8--9,繼續比較6和3的大小,6比3大,交換一下位置
3--6--7--8--9。到這裡迴圈結束,就已經排好序了。接著比較第n=5的元素1應該插入的位置,如此往復就把陣列給排好了序了。
一下是**。
//寫乙個隨機生成陣列的函式
function randomarr(count)
return arr
}// 交換元素位置的函式
function swap(arr, i, j)
var arr = randomarr(5000)
// 插入排序函式
function insertionsort(arr) else }}
return arr
}insertionsort(arr)
由於是兩層for迴圈,所以它的時間複雜度是n^2級別的。
到這裡其實還沒有完,插入排序還是有可以優化的地方的。現在的這個插入排序函式要swap頻繁的交換位置,我們可以這樣
function insertionsort(arr)
} else }}
return arr
}
雖然插入排序是n^2級別的演算法,但是在乙個近乎有序的陣列裡去實現插入排序,那麼他的效率會變的非常高。
有興趣可以寫乙個生成近乎有序陣列的函式去實驗一下。
// 近乎有序陣列
function nearlysorted(arr)
選擇排序就是在迴圈中不停的選擇最小的元素,然後交換位置。
下面來示範一下
6--7--8--9--3--1--4--6--3--8--9--5
找到陣列中最小的元素1,然後記錄1的位置是5。接著交換位置變成
1--7--8--9--3--6--4--6--3--8--9--5
接著在剩下的陣列裡7--8--9--3--6--4--6--3--8--9--5找到最小的元素3,記錄下它的下標位置是4,然後交換位置變成
1--3--8--9--7--6--4--6--3--8--9--5。如此往復直到排好序。
function randomarr(count)
return arr
}function swap(arr, i, j)
var arr = randomarr(5000)
function selectionsort(arr)
}swap(arr, i, pos)
} return arr
}selectionsort(arr)
到此兩個基礎排序就實現了。總結一下,插入排序優於選擇排序。
插入排序可以提前終止內層迴圈,如果陣列近乎有序,那麼效率會很高。而選擇排序無法提前終止迴圈。
不過最好的排序演算法還是nlogn級別的演算法。如歸併排序和快速排序。
我的寫的不是最好的,僅僅是解釋概念,有興趣的同學可以自己寫乙個更好的插入排序和選擇排序。
選擇排序和插入排序
選擇排序 時間複雜度 o n 2 額外空間複雜度o 1 選擇排序是從陣列的第乙個值即arr 0 開始,先假定當前值為最小值,記下index值,向後遍歷陣列,當 arr i 小於arr index 時,令index i 一直到arr length 1 獲得最小值的index然後與arr 0 交換,此時...
插入排序和選擇排序
排序 將一組雜亂無章的資料按照一定的規則有組織地排列起來。排序的穩定性 如果在排序中,存在前後相同的兩個元素的話,排序前和排序後他們的相對位置不發生變化。今天,先來學習插入排序和選擇排序 插入排序 直接插入排序 1 思想 每一步將乙個待排序的元其排序碼的大小,插入到前面已將排好序的一組元素的合適位置...
插入排序和選擇排序
插入排序 插入排序的基本操作就是將乙個資料插入到已經排好序的有序資料中,從而得到乙個新的 個數加一的有序資料。從第乙個元素開始,該元素可以認為已經被排序 取出下乙個元素,在已經排序的元素序列中從後向前掃瞄 如果該元素 已排序 大於新元素,將該元素移到下一位置 重複步驟3,直到找到已排序的元素小於或者...