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ù)組