选择排序
-
选择排序(Selection sort)是一种简单直观的排序算法。将数列分为未排序序列和已排序序列两部分,在未排序序列中找到最小(大)元素,存放到数列的起始(末尾)位置作为已排序序列的第一个元素,然后,再从剩余未排序序列中继续寻找最小(大)元素,然后放到已排序序列的末尾(起始)位置。以此类推,直到所有元素均排序完毕。
-
选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总共进行至多n-1次交换。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。
-
选择排序算法的具体运作如下:
- 首先将数列的第一个元素认为是最小的元素,记 min = 0,将其与其他元素进行比较,若找到了更小的元素,则改变 min 的值,遍历序列后,将 min 值对应的元素与第一个元素进行交换。
- 将数列的第二个元素认为是最小的元素,记 min = 1,重复以上步骤。
- 重复以上步骤,直到没有任何一对数字需要比较,排序完成。
-
算法实现(分步)
ali = [54, 26, 93, 22, 77, 31, 44, 55, 20]
n = len(ali) # 9
1.将数列的第一个元素 ali[0] 认为是最小的元素,记 min = 0,将其与其他元素进行比较,若找到了更小的元素,则改变 min 的值,遍历序列后,将 min 值对应的元素与第一个元素进行交换。
min = 0
for i in range(1, n):
if ali[i] < ali[min]:
min = i
ali[min], ali[0] = ali[0], ali[min]
2.将数列的第二个元素 ali[1] 认为是最小的元素,记 min = 1,将其与其他元素进行比较,若找到了更小的元素,则改变 min 的值,遍历序列后,将 min 值对应的元素与第二个元素进行交换。
3.重复以上步骤,直到将数列的倒数第二个元素 ali[n-2] 认为是最小的元素,记 min = n-2,将其与最后一个元素进行比较,若最后一个值更小,则改变 min 的值,将 min 值对应的元素与倒数第二个元素进行交换,完成排序。
- 算法实现(整体)
def selection_sort(ali):
n = len(ali)
for j in range(n-1):
min = j
for i in range(j+1, n):
if ali[i] < ali[min]:
min = i
ali[min], ali[j] = ali[j], ali[min]
if __name__ == '__main__':
ali = [54, 26, 93, 22, 77, 31, 44, 55, 20]
print(ali)
selection_sort(ali)
print(ali)
- 时间复杂度
最优时间复杂度: O ( n 2 ) O(n^2) O(n2)
最坏时间复杂度: O ( n 2 ) O(n^2) O(n2)
稳定性:不稳定(考虑升序每次选择最大的情况)