宝藏排序:
冒泡排序解题思想:
算法步骤:
比较相邻元素,如果第一个大于第二个则交换。
从左往右遍历一遍,重复第一步,可以保证最大的元素在最后面
重复上述操作,可以得到第二大、第三大...
比较方法:
给定一个长度为n的列表,算法循环n-1次可以得到有序序列
第一次循环两两比较:<a[0],a[1]>..., a[n-4],a[n-3]>, a[n-3],a[n-2]>, <a[n-2],a[n-1
第二次循环两两比较: <a[0],a[1]>...., <a[n-4],a[n-3]> , a[n-3],a[n-2]>
第三次循环两两比较: <a[0],a[1 ]>,...,<a[n-4],a[n-3]
第i次循环两两比较: <a[0],a[1]>,..., a[n-i-1],a[n-i]>
第n-1次循环两两比较:<a[0],a[1]
时间复杂度:O(n^2),空间复杂度O(1),稳定
代码详解:
代码语言:javascript复制n = int(input())
a = list(map(int,input().split()))
# map函数:将逗号左边的数据依次分隔后以逗号右边的数据类型返回
# 循环n-1次,每次获得第n大
for i in range(1, n):
# 每次比较a[j]和a[j 1]
for j in range(0, n - i):
if a[j] > a[j 1]:
a[j], a[j 1] = a[j 1], a[j]
print(' '.join(map(str, a))) # ' '.可以将输出的内容用空格隔开
选择排序解题思想:
算法步骤:
从左往右找到最小的元素,放在起始位置
重复上述步骤,依次找到第2小、第3小元素...
比较方法:
给定一个长度为n的列表,算法循环n-1次可以得到有序序列
第0次循环从[0,n-1]中找最小元素a[x],与a[0]交换
第1次循环从[1,n-1]中找最小元素,与a[1]交换
第2次循环从[2,n-1]中找最小元素,与a[2]交换
第i次循环从[i,n-1]中找最小元素,与a[i]交换
第n-2次循环从[n-2,n-1]中找最小元素,与a[n-2]交换
时间复杂度: O(n^2),空间复杂度O(1),稳定
代码详解:
代码语言:javascript复制n = int(input())
a = list(map(int, input().split()))
for i in range(n-1):
# 第i次从i到n-1找最小值
min_value = a[i]
min_idx = i
for j in range(i, n):
if a[j] < min_value:
min_value = a[j]
min_idx = j
# 将最小值和最前面的元素交换
a[min_idx], a[i] = a[i], a[min_idx]
print(' '.join(map(str, a)))
插入排序解题思想:
算法步骤:
第一个元素看做已排序,从左往右遍历每一个元素:
在已排序元素中从后往前扫描:如果当前元素大于新元素,则该元素移动到后一位
重复第二步直至找到小于等于新元素则停止
比较方法:
口将上述步骤看做摸牌,每次摸一张牌从后往前判断是否可以插入
对于第i张牌a[i],[0,i-1]中的牌都是已经排好顺序的
从后往前逐个判断a[i]是否大于a[i]
如果a[i]>a[i]:则a[i]往后挪一个位置
如果alij]<=a[i]:此时在a[j 1]的位置放置a[i]
时间复杂度:O(n^2),空间复杂度O(1),不稳定
代码详解:
代码语言:javascript复制n = int(input())
a = list(map(int,input().split()))
# 对于第i个数字,从后往前找对应插入的位置
for i in range(1, n):
value = a[i]
insert_idx = 0 # 插入元素的下表
for j in range(i - 1, -1, -1): # 左闭右开,从i-1到0,步长为-1
if a[j] > value:
# 往后挪
a[j 1] = a [j]
else:
insert_idx = j 1
break
# 插入第i个数字
a[insert_idx] = value
print(' '.join(map(str, a)))