嘻嘻我按照步骤来一步步讲解选择排序
第一步,是从第一个元素到最后一个元素中选择一个最小的元素
第二步,将选择的最小元素和列表中第一个元素交换,此时第一个元素是列表中元素最小的
第三步,从列表中第二个元素到最后一个元素开始选择其中最小的元素,此时选的元素是列表中第二小。
第四步,将第二小元素和列表中第二个元素进行交换。
以此类推,重复上列操作,每次选择一个最小的元素,这也是选择排序的由来
def selection_sort(arr):
n = len(arr)
for i in range(n):
min_idx = i
for j in range(i+1, n):
if arr[j] < arr[min_idx]:
min_idx = j
arr[i], arr[min_idx] = arr[min_idx], arr[i]
print(arr)#为明确选择排序的过程,每个步骤进行打印
return arr
a =[2,3,5,6,1,-1,7,9]#例子
selection_sort(a)
结果:
当然我们也可以看看选择排序数字移动的过程
没有 return arr就可以得到选择排列的过程
def selection_sort(arr):
n = len(arr)
for i in range(n):
min_idx = i
for j in range(i+1, n):
if arr[j] < arr[min_idx]:
min_idx = j
arr[i], arr[min_idx] = arr[min_idx], arr[i]
print(arr)#为明确选择排序的过程,每个步骤进行打印
#return arr
a =[2,3,5,6,1,-1,7,9]#例子
selection_sort(a)
改进
当然在以上算法有一个小瑕疵,在选择排序中,第一次循环中确实找到了最小元素,而且这个元素会在列表的开头。因此,在第一次迭代时有时可以不比较它,所以代码中可以改成
def selection_sort(arr):
n = len(arr)
for i in range(n-1):#在选择排序中,第一次循环中确实找到了最小元素,而且这个元素会在列表的开头。因此,在第一次迭代时有时可以不比较它
min_idx = i
for j in range(i+1, n):
if arr[j] < arr[min_idx]:
min_idx = j
arr[i], arr[min_idx] = arr[min_idx], arr[i]
print(arr)#为明确选择排序的过程,每个步骤进行打印
#return arr
a =[2,3,5,6,1,-1,7,9]#例子
selection_sort(a)
这样我们得到的过程中就更简洁:之前8次过程,现在7次,可以说之前的代码是已经完成了选择又多选择了一次
选择排序的时间复杂度为O(n^2)
其中n是待排序的元素数量。具体来说,选择排序包含两层循环。外层循环需要遍历包含n个元素的列表,而内层循环需要遍历包含剩下n-1个元素的子列表。因此,总共要执行n(n-1)/2次比较操作和n次的交换操作。这使得选择排序在最坏和平均情况下都具有相同的时间复杂度。
选择排序的空间复杂度为O(1)
因为选择排序使用常数个额外的变量来存储待排序列表的当前最小值和已排序列表的末尾,并且它不需要额外的列表或数组来完成排序。这使得它比某些其他排序算法更加节省存储空间。