选择排序思路:
首先,找到数组中最小的那个元素,其次,将它和数组的第一个元素交换位置(如果第一个元素就是最小元素那么它就和它自己交换)。
再次,在剩下的元素中找到最小的元素,将它和数组的第二个元素交换位置。如此往复,直到将整个数组排序。这种方法叫做选择排序,因为它在不断的选择剩余元素中的最小者。
def sort(arr): arr_len = len(arr) for i in range(arr_len): min_i = i for j in range(i + 1, arr_len): if less(arr[j], arr[min_i]): min_i = j exchange(arr, i, min_i)
如上述代码所示,选择排序的内循环只是在比较当前元素与目前已知的最小元素,这已经简单到了极点。交换元素的代码写在内循环之外,每次交换都能排定一个元素,因此交换的总次数是N。所以算法的时间效率取决于比较多次数。
分析可知:对于长度为N的数组,选择排序需要大约N2/2次比较和N次交换。因为对于索引为0到N-1的任意元素都会进行一次交换和N-1-i次比较,所以总共有N次交换以及(N-1)+(N-2)+...+2+1=N(N-1)/2 ~ N2/2次比较。
总的来说,选择排序是一种很容易理解和实现的简单排序算法,它有两个很鲜明的特点。
1.运行时间和输入状态无关:为了找出最小的元素而扫描一遍数组并不能为下一遍扫描提供任何信息。这种性质在某些情况下是缺点,因为使用选择排序的人可能会惊讶地发现,一个已经有序的数组或是主键全部相等的数组和一个元素随机排列的数组所用的排序时间竟然是一样的!我们将会看到其它的算法会更善于利用输入的初始状态。
2.数据移动是最少的:每次交换都会改变两个数组元素的值,因此选择排序用了N次交换,交换次数和数组大小是线性关系。我们将要研究的其它算法都不具备这个特性,大部分增长数量级都是线性对数或是平方级。