醋醋百科网

Good Luck To You!

[算法学习]选择排序(选择排序算法实现)

大家好,我是郭立员~

前言

在处理大小排序的时候,我喜欢用冒泡法排序,不过在随着接触排序算法的增多,我觉得选择排序更像是日常数字大小排列方法。

日常数字大小排列

这里有几个数字: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),但是在交换数据的过程,选择排序每一轮只交换一次,而冒泡排序的交换次数要多很多。

所以选择排序的速度要比冒泡排序快一些。

正文完=

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言