题目描述
一个栈中元素的类型为整型,现在想将该栈从顶到底按从大到小的顺序排序,只许申请一个栈。除此之外,可以申请新的变量,但不能申请额外的数据结构。如何完成排序?
输入描述
第一行输入一个N,表示栈中元素的个数
第二行输入N个整数a_iai表示栈顶到栈底的各个元素
输出描述
输出一行表示排序后的栈中栈顶到栈底的各个元素。
N = int(input())
arr = list(map(int, input().split()))
stack = []
i = 1
while len(stack)<N:
min_num = arr.pop()
while arr:
temp = arr.pop()
if min_num > temp:
stack.append(min_num)
min_num = temp
else:
stack.append(temp)
j = 0
while N-i>j:
arr.append(stack.pop())
j += 1
stack.append(min_num)
i += 1
while stack:
print(stack.pop(),end=" ")
print
思路:
每遍历一遍,就找到一个最小元素,然后将其他元素入栈stack,记住已经找到的最小元素的个数i,保留i个元素将剩余的的元素入栈arr,重复过程指导arr为空。这种思路针对最优的情况下时间复杂度和最坏情况是相同的,《程序员代码面试指南》中的思路更好一些,如下所述。
N = int(input())
stack = list(map(int, input().split()))
def reverse(stack):
hel = []
while (stack):
cur = stack.pop()
while (hel and cur>hel[-1]):
stack.append(hel.pop())
hel.append(cur)
while hel:
stack.append(hel.pop())
return stack
reverse(stack)
思路:
类似于冒泡的思想,当hel栈顶的元素小于stack栈顶的元素时,则入栈;否则将hel栈中大的元素全部重新入栈stack,重复这个过程。