我准备进行软件开发人员的面试和复习算法问题。我无法弄清楚如何修改插入排序算法,以便按照排序顺序返回 n 的 n 数组的 k 最小元素。
插入排序算法
for i = 1 to n
j = i
while j > 0 and A[j-1] > A[j]
swap A[j] and A[j-1]
j = j - 1
在算法结尾添加for循环以获取第一个 k 元素并不算数。
答案 0 :(得分:5)
使用正常的插入排序,您从头到尾循环,每个项目都是 向上移动直到它到位。使用此插入排序,您仍然循环 从开始到结束,但如果您所在的项目是> =第k项,那么 别管它;如果更少,将其移动到 k 的位置,然后将其向上移动直到它为止 到位。
for i = 1 to k
j = i
while j > 1 and A[j-1] > A[j]
swap A[j] and A[j-1]
j = j - 1
现在已对第一个 k 项目进行了排序。
for i = k + 1 to n
if A[i] < A[k]
swap A[i] and A[k]
j = k
while j > 1 and A[j-1] > A[j]
swap A[j] and A[j-1]
j = j - 1
答案 1 :(得分:0)
另一种选择是对元素k + 1到n有选择地执行内循环。与之前的解决方案几乎相同,但避免了一些重复的代码。
for i = 1 to n
j = i
if i < k or A[i] < A[k]
while j > 0 and A[j-1] > A[j]
swap A[j] and A[j-1]
j = j - 1