【Python算法作业】求数组中大小最接近2个元素的差
# 【1.2.9】求数组中大小最接近2个元素的差
"""
算法思想:①先用【快速排序】对数组从大到小排序;
②对排列后的降序数组,计算相邻两个元素的差;
③找出【最小的差】即可。
"""
# 快速排序算法
'''
参考(图解、其他语言编写的代码):
《快速排序(过程图解)》(有错误,注意甄别)[]
《图解快速排序》(有错误,注意甄别)[]
'''
def quickSort(L, _left, _right):
left = _left # 因为需要递归,所以先保存 左指针(哨兵)
right = _right # 因为需要递归,所以先保存 右指针(哨兵)
baseNum = L[left] # 将基准元素设置为 L[left]
# 右左交替扫描,直到两个指针(哨兵) left == right
while (left != right):
# 先从右向左扫描(因为选择的 baseNum 基准元素是最左边的L[left])
# 找到第1个比base基准元素小的元素
while (right > left and L[right] <= baseNum): # 降序排列,使用【<=】;如果是升序排列,使用【>=】
right = right - 1
# 需要交替 进行右、左扫描:现进行【从左往右】扫描
while (left < right and L[left] >= baseNum): # 降序排列,使用【>=】;如果是升序排列,使用【<=】
left = left + 1
if (left < right): # 交换 两个指针(哨兵) left、 right 所指的值
temp = L[left]
L[left] = L[right]
L[right] = temp
# 两个指针(哨兵) left == right ,该位置就是 之前选择的 基准元素baseNum = L[left] 应该所在的位置
# 交汇指针(哨兵) 所指的数值,放入到 原基准元素baseNum 的位置,也就是 [_left] 位置
L[_left] = L[right]
# 基准元素baseNum 入列归位!
L[right] = baseNum
# 对 基准元素baseNum 左边的元素进行【递归 快速排序】;注意这时,两个指针(哨兵) left == right
if ((_left < left) and (left >= 1)): # 注意 if语句中的条件判断,防止无穷递归调用!
quickSort(L, _left, left - 1)
# 对 基准元素baseNum 右边的元素进行【递归 快速排序】;注意这时,两个指针(哨兵) left == right
if ((right < _right) and (right + 1 <= _right)): # 注意 if语句中的条件判断,防止无穷递归调用!
quickSort(L, right + 1, _right)
# 针对已经按照 从大到小 降序排列的 列表,求【最接近的两个元素的差】
def findMinDifference(L):
minDifferent = 2 ** 100 # 先设置差为一个 很大的数
# 考虑 L 只包含 1个元素
if (len(L) == 1):
print("只有 1个元素!")
return
if (len(L) > 1): # L至少有2个及以上的元素
for i in range(len(L) - 1):
if((L[i] - L[i + 1]) < minDifferent):
minDifferent = (L[i] - L[i + 1])
return minDifferent
if __name__ == '__main__':
strA = input("请输入要排序的一系列数(用空格分隔):")
A = strA.split() # A 是一个list列表
# A列表中的元素,进行 float 数值化
A = [float(A[i]) for i in range(len(A))]
print("您输入的{}个数值为:{}".format(len(A), A))
# 按照【从大到小】进行快速排序,即【降序排列】
quickSort(A, 0, len(A) - 1)
print("降序排列之后:{}".format(A))
# 求【最接近的两个元素的差】
minDiff = findMinDifference(A)
print("最接近的两个元素的差为:{}".format(minDiff))
print("主程序运行结束。")
测试:
请输入要排序的一系列数(用空格分隔):1 3 6 9 2 3
您输入的6个数值为:[1.0, 3.0, 6.0, 9.0, 2.0, 3.0]
降序排列之后:[9.0, 6.0, 3.0, 3.0, 2.0, 1.0]
最接近的两个元素的差为:0.0
主程序运行结束。