好程式設計師web前端培訓分享JavaScript學習筆陣列的排序
好程式設計師web 前端培訓分享 JavaScript 學習筆陣列的排序 , 排序,就是把一個亂序的陣列,透過我們的處理,讓他變成一個有序的陣列 , 今天我們講解兩種方式來排序一個陣列 氣泡排序 和 選擇排序
氣泡排序
· 先遍歷陣列,讓挨著的兩個進行比較,如果前一個比後一個大,那麼就把兩個換個位置
· 陣列遍歷一遍以後,那麼最後一個數字就是最大的那個了
· 然後進行第二遍的遍歷,還是按照之前的規則,第二大的數字就會跑到倒數第二的位置
· 以此類推,最後就會按照順序把陣列排好了
1、我們先來準備一個亂序的陣列
var arr = [ 3 , 1 , 5 , 6 , 4 , 9 , 7 , 2 , 8 ]
· 接下來我們就會用程式碼讓陣列排序
2、先不著急迴圈,先來看陣列裡面內容換個位置
// 假定我現在要讓陣列中的第 0 項和第 1 項換個位置// 需要藉助第三個變數 var tmp = arr[ 0 ]arr[ 0 ] = arr[ 1 ]arr[ 1 ] = tmp
3、第一次遍歷陣列,把最大的放到最後面去
for ( var i = 0 ; i < arr.length; i ++ ) {
// 判斷,如果陣列中的當前一個比後一個大,那麼兩個交換一下位置 if (arr[i] > arr[i + 1 ]) {
var tmp = arr[i]
arr[i] = arr[i + 1 ]
arr[i + 1 ] = tmp
}}
// 遍歷完畢以後,陣列就會變成 [3, 1, 5, 6, 4, 7, 2, 8, 9]
· 第一次結束以後,陣列中的最後一個,就會是最大的那個數字
· 然後我們把上面的這段程式碼執行多次。陣列有多少項就執行多少次
4、按照陣列的長度來遍歷多少次
for ( var j = 0 ; j < arr.length; j ++ ) {
for ( var i = 0 ; i < arr.length; i ++ ) {
// 判斷,如果陣列中的當前一個比後一個大,那麼兩個交換一下位置 if (arr[i] > arr[i + 1 ]) {
var tmp = arr[i]
arr[i] = arr[i + 1 ]
arr[i + 1 ] = tmp
}
}}
// 結束以後,陣列就排序好了
5、給一些最佳化
· 想象一個問題,假設陣列長度是 9,第八次排完以後
· 後面八個數字已經按照順序排列好了,剩下的那個最小的一定是在最前面
· 那麼第九次就已經沒有意義了,因為最小的已經在最前面了,不會再有任何換位置出現了
· 那麼我們第九次遍歷就不需要了,所以我們可以減少一次
for ( var j = 0 ; j < arr.length - 1 ; j ++ ) {
for ( var i = 0 ; i < arr.length; i ++ ) {
// 判斷,如果陣列中的當前一個比後一個大,那麼兩個交換一下位置 if (arr[i] > arr[i + 1 ]) {
var tmp = arr[i]
arr[i] = arr[i + 1 ]
arr[i + 1 ] = tmp
}
}}
· 第二個問題,第一次的時候,已經把最大的數字放在最後面了
· 那麼第二次的時候,其實倒數第二個和最後一個就不用比了
· 因為我們就是要把倒數第二大的放在倒數第二的位置,即使比較了,也不會換位置
· 第三次就要倒數第三個數字就不用再和後兩個比較了
· 以此類推,那麼其實每次遍歷的時候,就遍歷當前次數 - 1 次
for ( var j = 0 ; j < arr.length - 1 ; j ++ ) {
for ( var i = 0 ; i < arr.length - 1 - j; i ++ ) {
// 判斷,如果陣列中的當前一個比後一個大,那麼兩個交換一下位置 if (arr[i] > arr[i + 1 ]) {
var tmp = arr[i]
arr[i] = arr[i + 1 ]
arr[i + 1 ] = tmp
}
}}
6、至此,一個氣泡排序就完成了
選擇排序
· 先假定陣列中的第 0 個就是最小的數字的索引
· 然後遍歷陣列,只要有一個數字比我小,那麼就替換之前記錄的索引
· 知道陣列遍歷結束後,就能找到最小的那個索引,然後讓最小的索引換到第 0 個的位置
· 再來第二趟遍歷,假定第 1 個是最小的數字的索引
· 在遍歷一次陣列,找到比我小的那個數字的索引
· 遍歷結束後換個位置
· 依次類推,也可以把陣列排序好
1、準備一個陣列 var arr = [3, 1, 5, 6, 4, 9, 7, 2, 8]
2、假定陣列中的第 0 個是最小數字的索引 var minIndex = 0
3、遍歷陣列,判斷,只要數字比我小,那麼就替換掉原先記錄的索引
var minIndex = 0 for ( var i = 0 ; i < arr.length; i ++ ) {
if (arr[i] < arr[minIndex]) {
minIndex = i
}}
// 遍歷結束後找到最小的索引// 讓第 minIndex 個和第 0 個交換 var tmp = arr[minIndex]arr[minIndex] = arr[ 0 ]arr[ 0 ] = tmp
4、按照陣列的長度重複執行上面的程式碼
for ( var j = 0 ; j < arr.length; j ++ ) {
// 因為第一遍的時候假定第 0 個,第二遍的時候假定第 1 個 // 所以我們要假定第 j 個就行 var minIndex = j
// 因為之前已經把最小的放在最前面了,後面的迴圈就不需要判斷前面的了 // 直接從 j + 1 開始 for ( var i = j + 1 ; i < arr.length; i ++ ) {
if (arr[i] < arr[minIndex]) {
minIndex = i
}
}
// 遍歷結束後找到最小的索引 // 第一堂的時候是和第 0 個交換,第二趟的時候是和第 1 個交換 // 我們直接和第 j 個交換就行 var tmp = arr[minIndex]
arr[minIndex] = arr[j]
arr[j] = tmp}
5、一些最佳化
· 和之前一樣,倒數第二次排序完畢以後,就已經排好了,最後一次沒有必要了
for ( var j = 0 ; j < arr.length - 1 ; j ++ ) {
var minIndex = j
for ( var i = j + 1 ; i < arr.length; i ++ ) {
if (arr[i] < arr[minIndex]) {
minIndex = i
}
}
var tmp = arr[minIndex]
arr[minIndex] = arr[j]
arr[j] = tmp}
· 在交換變數之前,可以判斷一下,如果我們遍歷後得到的索引和當前的索引一直
· 那麼就證明當前這個就是目前最小的,那麼就沒有必要交換
· 做一我們要判斷,最小作引和當前作引不一樣的時候,才交換
for ( var j = 0 ; j < arr.length - 1 ; j ++ ) {
var minIndex = j
for ( var i = j + 1 ; i < arr.length; i ++ ) {
if (arr[i] < arr[minIndex]) {
minIndex = i
}
}
if (minIndex !== j) {
var tmp = arr[minIndex]
arr[minIndex] = arr[j]
arr[j] = tmp
}}
6、至此,選擇排序完成
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913864/viewspace-2691543/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 好程式設計師web前端培訓分享JavaScript學習筆記之陣列程式設計師Web前端JavaScript筆記陣列
- 好程式設計師web前端培訓分享學習JavaScript程式設計師Web前端JavaScript
- 好程式設計師web前端培訓分享JavaScript學習筆記Promise程式設計師Web前端JavaScript筆記Promise
- 好程式設計師web前端培訓分享JavaScript學習筆記SASS程式設計師Web前端JavaScript筆記
- 好程式設計師web前端培訓分享JavaScript學習筆記cookie程式設計師Web前端JavaScript筆記Cookie
- 好程式設計師web前端培訓分享JavaScript學習指南程式設計師Web前端JavaScript
- 好程式設計師web前端培訓分享JavaScript學習筆記之設計模式程式設計師Web前端JavaScript筆記設計模式
- 好程式設計師web前端培訓分享node學習筆記程式設計師Web前端筆記
- 好程式設計師web前端培訓分享JavaScript學習筆記分支結構程式設計師Web前端JavaScript筆記
- 好程式設計師web前端培訓分享JavaScript學習筆記之正則程式設計師Web前端JavaScript筆記
- 好程式設計師web前端培訓JavaScript學習筆記DOM程式設計師Web前端JavaScript筆記
- 好程式設計師web前端培訓JavaScript學習筆記--jQuery程式設計師Web前端JavaScript筆記jQuery
- 好程式設計師web前端培訓分享HTMLCSS學習筆記BFC程式設計師Web前端HTMLCSS筆記
- 好程式設計師web前端培訓分享React學習筆記(一)程式設計師Web前端React筆記
- 好程式設計師web前端培訓分享React學習筆記(二)程式設計師Web前端React筆記
- 好程式設計師web前端培訓分享React學習筆記(三)程式設計師Web前端React筆記
- 好程式設計師web前端培訓分享JavaScript學習筆記函式進階程式設計師Web前端JavaScript筆記函式
- 好程式設計師web前端培訓分享JavaScript學習筆記之ES5程式設計師Web前端JavaScript筆記
- 好程式設計師web前端培訓分享JavaScript學習筆記之迴圈結構程式設計師Web前端JavaScript筆記
- 好程式設計師web前端培訓分享JavaScript學習筆記閉包與繼承程式設計師Web前端JavaScript筆記繼承
- 好程式設計師web前端培訓分享JavaScript學習筆記ajax及ajax封裝程式設計師Web前端JavaScript筆記封裝
- 好程式設計師web前端培訓分享JavaScript框架J程式設計師Web前端JavaScript框架
- 好程式設計師web前端培訓分享之HTMLCSS學習筆記css3-多列程式設計師Web前端HTMLCSS筆記S3
- 好程式設計師web前端培訓分享詳解JavaScript學習筆記建構函式程式設計師Web前端JavaScript筆記函式
- 好程式設計師web前端培訓分享怎樣學好css?程式設計師Web前端CSS
- 好程式設計師web前端培訓學習筆記Vue學習筆記一程式設計師Web前端筆記Vue
- 好程式設計師web前端培訓分享九個JavaScript小技巧程式設計師Web前端JavaScript
- 好程式設計師web前端培訓分享JavaScript基礎語法程式設計師Web前端JavaScript
- 好程式設計師web前端培訓分享JavaScript相關知識程式設計師Web前端JavaScript
- 好程式設計師web前端培訓分享Javascript中原型屬性程式設計師Web前端JavaScript原型
- 好程式設計師web前端培訓分享HTMLCSS學習之CSS基礎程式設計師Web前端HTMLCSS
- 好程式設計師web前端培訓分享CSS基礎知識學習程式設計師Web前端CSS
- 好程式設計師web前端培訓分享node學習筆記系列之四十一程式設計師Web前端筆記
- 好程式設計師web前端培訓學習筆記Vue學習筆記之二程式設計師Web前端筆記Vue
- 好程式設計師web前端培訓分享Vue面試題程式設計師Web前端Vue面試題
- 好程式設計師web前端培訓分享CSS定位的教程程式設計師Web前端CSS
- 好程式設計師web前端培訓分享HTMLCSS學習筆記css3選擇器程式設計師Web前端HTMLCSS筆記S3
- 好程式設計師web前端培訓分享小白學web常見的問題程式設計師Web前端