[编程入门]选择排序
时间限制: 2s 内存限制: 192MB 提交: 55007 解决: 28427
题目描述
用选择法对10个整数从小到大排序。
输入格式
输入10个无序的数字
输出格式
排序好的10个整数
样例输入
复制
4 85 3 234 45 345 345 122 30 12
样例输出
复制
3
4
12
30
45
85
122
234
345
345
提示
解法一
nums = list(map(int, input().split()))
# 外层循环,控制排序轮数
for i in range(len(nums) - 1):
min_idx = i # 初始化最小索引为当前位置
# 内层循环,找出未排序部分的最小元素索引
for j in range(i + 1, len(nums)):
if nums[j] < nums[min_idx]:
min_idx = j
# 如果最小索引不是当前位置,交换元素
if min_idx!= i:
nums[i], nums[min_idx] = nums[min_idx], nums[i]
# 输出排序后的元素
for num in nums:
print(num)
以下是选择排序的详细题解过程:
- 首先获取输入的 10 个无序数字并存入数组
nums
。 - 进入外层循环,从数组的第一个元素开始,到倒数第二个元素为止(因为最后一个元素无需再比较)。
- 对于每一轮外层循环,先假设当前位置的元素就是这一轮未排序部分的最小值,并记录其索引为
min_idx
。 - 然后通过内层循环,从当前位置的下一个元素开始到数组末尾,依次与假设的最小值比较。如果找到更小的元素,就更新
min_idx
。 - 当内层循环结束后,如果发现真正的最小值索引不是最初假设的索引(即
min_idx
发生了变化),则将当前位置的元素和真正的最小值元素进行交换。 - 这样就完成了一轮选择排序,即确定了当前未排序部分的最小值在正确的位置上。
- 重复以上步骤,直到整个数组都完成排序。
- 最后输出排序后的数组元素。
解法二
nums = list(map(int, input().split()))
# 外层循环,控制冒泡轮数,共进行数组长度-1 轮
for i in range(len(nums) - 1):
# 标记是否发生交换
flag = False
# 内层循环,每一轮将最大的数“浮”到末尾
for j in range(0, len(nums) - i - 1):
if nums[j] > nums[j + 1]:
nums[j], nums[j + 1] = nums[j + 1], nums[j]
flag = True
# 如果这一轮没有发生交换,说明已经排序完成,提前结束
if not flag:
break
for num in nums:
print(num)
以下是冒泡排序的详细解题过程:
- 输入 10 个无序的整数,并存入数组
nums
。 - 进入外层的循环
i
,它从 0 到数组长度减 1 进行迭代。这个循环控制冒泡的轮数。 - 在每一轮中,设置一个标志
flag
为 False,用于标记在这一轮中是否发生了交换。 - 开始内层循环
j
,从 0 到数组长度减去当前轮数再减 1。这个内层循环用于比较相邻的元素。 - 如果当前元素
nums[j]
大于下一个元素nums[j+1]
,则交换它们的位置,并将flag
设置为 True,表示发生了交换。 - 当内层循环结束后,检查
flag
。如果flag
仍然为 False,说明在这一轮中没有发生交换,即数组已经是有序的,此时可以提前结束排序。 - 继续进行下一轮外层循环,重复上述步骤,直到整个数组排序完成。
- 最后输出排序后的数组元素。
在这个过程中,每一轮都会将当前未确定位置的最大元素“冒泡”到数组的末尾,经过多轮后,数组就会按照从小到大的顺序排列。
解法三
nums = list(map(int, input().split()))
sorted_nums = sorted(nums)
for num in sorted_nums:
print(num)
以下是解题过程:
- 首先通过
input().split()
获取用户输入的以空格分隔的整数字符串列表。 - 然后使用
map(int,...)
将这些字符串转换为整数,并将结果存储在nums
列表中。 - 接着调用内置函数
sorted()
对nums
列表进行排序,它会返回一个排好序的新列表sorted_nums
。 - 最后通过遍历
sorted_nums
列表并逐个输出元素,得到排序后的结果。
sorted()
函数会按照默认的升序对列表进行排序,非常方便快捷地实现了排序操作。