Swift 選擇排序/冒泡排序

var arr = [9,19,1,3,2,7,5,10,11,13]

選擇排序
     // 從for循環(huán)可以看出,每次循環(huán),都是拿i+1的數(shù)據(jù),在跟i作對比
     // 一輪循環(huán)下來,已經(jīng)把最小的值放在了數(shù)組的第一位
     // 第二輪循環(huán),已經(jīng)從下表 i + 1開始了,不再對比 i 的數(shù)據(jù)了,因為在第一輪的時候,最小值已經(jīng)放在了第一位了
     // 所以第二輪的時候,是從i + 1開始的
     // 通俗點講,就是數(shù)組的第一個數(shù)據(jù)和數(shù)組后面的每一個數(shù)據(jù)進行對比,遇到大的,就換位置,直到數(shù)組最后一個數(shù)據(jù)對比完畢,然后進行第二輪,從數(shù)組的第二個開始,和后面的每一個數(shù)據(jù)做比較,以此循環(huán)
     // 復(fù)雜度可以理解為 O(n) * O(n -1)
     for i in 0..<(arr.count - 1) {
         for j in (i+1)..<(arr.count) {
             if arr[i] > arr[j] {
                 let temp = arr[i]
                 arr[i] = arr[j]
                 arr[j] = temp
             }
         }
     }
冒泡排序
    for i in 0..<(arr.count - 1) {
            for j in 0..<(arr.count - 1 - i) {
                if arr[j] > arr[j + 1] {
                    let temp = arr[j]
                    arr[j] = arr[j + 1]
                    arr[j + 1] = temp
                }
            }
        }
     [9,19,1,3,2,7,5,10,11,13]
     當(dāng) i=0時 i層 arr.count - 1 = 9
     當(dāng) i=0時 j層 arr.count - 1 - 0 = 9
     i層 [9,19,1,3,2,7,5,10,11] (0..<9)
     j層 [9,19,1,3,2,7,5,10,11] (0..<9)
    
     當(dāng) i=1時 i層 arr.count - 1 = 9
     當(dāng) i=1時 j層 arr.count - 1 - 1 = 8
     i層 [9,19,1,3,2,7,5,10,11] (0..<9)
     j層 [9,19,1,3,2,7,5,10] (0..<8)
        
     當(dāng) i=2時 i層 arr.count - 1 = 9
     當(dāng) i=2時 j層 arr.count - 1 - 2 = 7
     i層 [9,19,1,3,2,7,5,10,11] (0..<9)
     j層 [9,19,1,3,2,7,5] (0..<7)
    
     當(dāng) i=3時 i層 arr.count - 1 = 9
     當(dāng) i=3時 j層 arr.count - 1 - 3 = 6
     i層 [9,19,1,3,2,7,5,10,11] (0..<9)
     j層 [9,19,1,3,2,7] (0..<6)
    
     當(dāng) i=4時 i層 arr.count - 1 = 9
     當(dāng) i=4時 j層 arr.count - 1 - 4 = 5
     i層 [9,19,1,3,2,7,5,10,11] (0..<9)
     j層 [9,19,1,3,2] (0..<5)
    
     當(dāng) i=5時 i層 arr.count - 1 = 9
     當(dāng) i=5時 j層 arr.count - 1 - 5 = 4
     i層 [9,19,1,3,2,7,5,10,11] (0..<9)
     j層 [9,19,1,3] (0..<4)
    
     當(dāng) i=6時 i層 arr.count - 1 = 9
     當(dāng) i=6時 j層 arr.count - 1 - 6 = 3
     i層 [9,19,1,3,2,7,5,10,11] (0..<9)
     j層 [9,19,1] (0..<3)
    
     當(dāng) i=7時 i層 arr.count - 1 = 9
     當(dāng) i=7時 j層 arr.count - 1 - 7 = 2
     i層 [9,19,1,3,2,7,5,10,11] (0..<9)
     j層 [9,19] (0..<2)

     當(dāng) i=8時 i層 arr.count - 1 = 9
     當(dāng) i=8時 j層 arr.count - 1 - 8 = 1
     i層 [9,19,1,3,2,7,5,10,11] (0..<9)
     j層 [9] (0..<1)

可以發(fā)現(xiàn)j層的數(shù)據(jù)范圍在越來越小,而j層每次一次的兩兩對比,都會把最大的值放到最后
因為最大的值已經(jīng)在數(shù)組的尾部了,那么下次對比的時候,就可以縮小范圍
不需要遍歷到最后一個
j層每一輪的遍歷完畢,下一輪的遍歷范圍都會縮小1,所以j層數(shù)組數(shù)量每
都少一個,從上面觀察的來看便是如此
我再把j層每次變化的數(shù)據(jù)放在一起,方便大家做比較
[9,19,1,3,2,7,5,10,11]
[9,19,1,3,2,7,5,10]
[9,19,1,3,2,7,5]
[9,19,1,3,2,7]
[9,19,1,3,2]
[9,19,1,3]
[9,19,1]
[9,19]
[9]

注意,以上只是展示數(shù)組數(shù)量上的變化,并未做排序,排序可以在for循環(huán)里每次打印j層的數(shù)組

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容