大家好,我是郭立员~
前言
在处理大小排序的时候,我喜欢用冒泡法排序,不过在随着接触排序算法的增多,我觉得选择排序更像是日常数字大小排列方法。
日常数字大小排列
这里有几个数字:3、8、6、1、2、7
如果把它们进行从小到大的排序,很容易就得到1、2、3、6、7、8
我是怎么得到这个排序的呢?
原数据:3、8、6、1、2、7
第一步:找到最小值1,单独存下来。
第二步:在剩余数字中找到最小值2,在和1放入一起。
以此类推,直到把所有数字都转存一遍。
由于数字比较少,对应人来说很轻松的就排序完所有数字。
代码实现选择排序
①、如果找到一组数字中最小值的位置(第几个数字)
首先假设“最小数字的位置”在第1个位置,这里是假设的最小值并不是真实的,然后从第2个数字开始和“最小数字的位置”的数字比较。
如果小于“最小数字的位置”的数字,说明有新的最小数字了,那么把第2个位置当作“最小数字的位置”。
当然如果大于“最小数字的位置”的数字,那么“最小数字的位置”不变,继续往后比较。
这个比较过程是循环执行,直到比对完全不数字。
当循环结束,能够知道“最小数字的位置”了。
Dim arr = {3, 8, 6, 1, 2, 7}
Dim min_index = 1
For i = 2 To Len(arr)
If arr[i] < arr[min_index] Then
min_index = i
End If
Next
TracePrint min_index
②、假定“最小数字的位置”和真实“最小数字的位置”进行数字交换。
上一步中,假定的“最小数字的位置”是第1个位置,真实的“最小数字的位置”是经过循环比较得到的,交换两个位置的数字,就把最小数字放到第一个位置了。
按键数组中交换两个数字的位置,需要引入一个临时变量作为中转的媒介,然后进行数组中数字的替换。
Dim arr = {3, 8, 6, 1, 2, 7}
Dim temp
temp = arr[1]
arr[1] = arr[4]
arr[4] = temp
TracePrint encode.TableToJson(arr)
③、重复①、②两个步骤,每次循环按顺序更换假定的“最小数字的位置”。
其实经过①、②两个步骤以后,第一个位置就是最小值了,剩余的为止就是一个新的无须数组,再次执行①、②两个步骤,就可以得到新数组的最小值,这个最小值是原数组的次小值(第2小的值)
原数组:3, 8, 6, 1, 2, 7
第1次:1, 8, 6, 3, 2, 7
第2次:1, 2, 6, 3, 8, 7
第3次:1, 2, 3, 6, 8, 7
第4次:1, 2, 3, 6, 8, 7
第5次:1, 2, 3, 6, 7, 8
新的数组前半部分是有序排列,后半部是无序排列。
选择排序的代码
Dim arr = {3, 8, 6, 1, 2, 7}
For j = 1 to Len(arr) - 1
Dim min_index = j
For i = j + 1 To Len(arr)
If arr[i] < arr[min_index] Then
min_index = i
End If
Next
TracePrint min_index
Dim temp
temp = arr[j]
arr[j] = arr[min_index]
arr[min_index] = temp
Next
TracePrint encode.TableToJson(arr)
和冒泡排序相比,选择排序的循环次数的复杂度是同一量级的O(n^2),但是在交换数据的过程,选择排序每一轮只交换一次,而冒泡排序的交换次数要多很多。
所以选择排序的速度要比冒泡排序快一些。
正文完=