1:定义:选择排序(Selection Sort)是一种简单易懂的排序算法,它的工作原理是不断地从未排序部分中选择最小(或最大)的元素,将其放置到已排序部分的末尾。以下是选择排序的基本步骤:
- 从数组的第一个元素开始,遍历整个数组,寻找最小(或最大)的元素。
- 将找到的最小(或最大)元素与数组的第一个元素互换位置。
- 重新开始遍历,这次从第二个元素开始,重复上述步骤。
- 继续这个过程,直到整个数组都排好序,即所有的元素都已按照升序(或降序)排列。
选择排序的时间复杂度是O(n^2),其中 n 是数组的元素个数。这种排序算法适用于较小的数据集,但在大规模数据集的排序中,效率较低。优点是排序过程中需要的额外空间较少,空间复杂度为O(1)。
以下是一个使用Python实现的选择排序示例:
def selection_sort(arr):
for i in range(len(arr)):
min_idx = i
for j in range(i+1, len(arr)):
if arr[j] < arr[min_idx]:
min_idx = j
arr[i], arr[min_idx] = arr[min_idx], arr[i]
arr = [64, 34, 25, 12, 22, 11, 90]
selection_sort(arr)
print("Sorted array is:", arr)
2:用NBA具象化例子 把选择排序与冒泡排序对比
假设我们要按照得分将NBA球员排名,我们将分别用选择排序和冒泡排序来说明这个过程:
选择排序: 假设你是教练,你需要找到得分最高的球员来领取MVP奖。你在场边观察所有球员,并记录他们的得分。在这个过程中,你将:
- 观察所有球员,找到得分最高的球员。
- 让得分最高的球员站在队伍的最前面。
- 然后在剩下的球员中找到得分最高的球员。
- 让他站在第一个球员的右边,也就是第二个位置。
- 重复此过程,直到所有球员按得分顺序站好。
在每个回合里,你选择得分最高的球员,并让他们站到已排序区域的末尾。
冒泡排序: 现在假设你是另一位教练,也需要找到得分最高的球员来领取MVP奖。这次,你将:
- 挨个比较处于相邻位置的球员,如果左侧球员的得分低于右侧球员,则交换他们的位置。
- 持续按这种方式比较和交换,直到得分最高的球员“冒泡”到队伍的最后。
- 将队伍的最后位置锁定,因为得分最高的球员已经处于正确的位置。
- 再次执行比较和交换操作,这次直到倒数第二个位置。
- 重复此过程,直到所有球员按得分顺序站好。
在这个过程中,得分最高的球员会逐步地“冒泡”到他们应该站的位置。
通过这两个具象化的NBA例子,我们可以看到选择排序和冒泡排序在排序过程和操作方式上的主要区别。在选择排序中你会找到最值并将其放置到正确的位置,在冒泡排序中则逐个比较相邻元素并逐步将最值移到正确的位置。
3:完整执行过程:
我们继续使用NBA球员得分为例。假设我们有这样一个得分数组:[23, 34, 12, 40, 67],表示五位NBA球员的得分。现在我们希望对这个数组进行升序排序。
选择排序:
- 遍历整个数组,找到最小值,这里是12,将它与第一个元素(23)交换。得到新的数组:[12, 34, 23, 40, 67]。
- 遍历剩下的元素(不包括12),找到最小值23,和第二个元素(34)交换。现在的数组是:[12, 23, 34, 40, 67]。
- 遍历剩下的元素(不包括12和23),发现34就是最小值,保持原位。数组不变:[12, 23, 34, 40, 67]。
- 遍历剩下的元素(不包括12、23和34),发现40就是最小值,保持原位。数组不变:[12, 23, 34, 40, 67]。
- 此时只剩一个数,已经排好序。
冒泡排序:
- 从数组的第一个元素开始, 比较23和34,23较小,不交换。接着比较34与12,34较大,交换。则得新数组:[23, 12, 34, 40, 67]
- 继续,比较23和12,23较大,交换;比较23和34,23较小,不交换。至此我们已经将最大值67移动到了正确的位置:[12, 23, 34, 40, 67]。
- 重复上述过程,将剩余的数字进行冒泡排序。第一轮交换12和23,然后比较23和34,23小不交换;此时将次大值40也放在了正确的位置:[12, 23, 34, 40, 67]。
- 重复一次,此时不再发生任何交换,数组已经是升序排列:[12, 23, 34, 40, 67]。