天天看點

好程式員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++) {

// 判斷,如果數組中的目前一個比後一個大,那麼兩個交換一下位置    if (arr[i] > arr[i + 1]) {
  var tmp = arr[i]
  arr[i] = arr[i + 1]
  arr[i + 1] = tmp
}           

第二個問題,第一次的時候,已經把最大的數字放在最後面了

那麼第二次的時候,其實倒數第二個和最後一個就不用比了

因為我們就是要把倒數第二大的放在倒數第二的位置,即使比較了,也不會換位置

第三次就要倒數第三個數字就不用再和後兩個比較了

以此類推,那麼其實每次周遊的時候,就周遊目前次數 - 1 次

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 = 0for (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、按照數組的長度重複執行上面的代碼

// 因為第一遍的時候假定第 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、一些優化

和之前一樣,倒數第二次排序完畢以後,就已經排好了,最後一次沒有必要了

var minIndex = j

for (var i = j + 1; i < arr.length; i++) {

if (arr[i] < arr[minIndex]) {
  minIndex = i
}           

var tmp = arr[minIndex]

在交換變量之前,可以判斷一下,如果我們周遊後得到的索引和目前的索引一直

那麼就證明目前這個就是目前最小的,那麼就沒有必要交換

做一我們要判斷,最小作引和目前作引不一樣的時候,才交換

if (arr[i] < arr[minIndex]) {
  minIndex = i
}           

if (minIndex !== j) {

var tmp = arr[minIndex]
arr[minIndex] = arr[j]
arr[j] = tmp              

6、至此,選擇排序完成

繼續閱讀