我正在编写此算法进行排序。我没有看到它与插入排序有何不同。我想知道是否有人可以帮我理解差异。当前的排序是作为插入写的,因为我还没有看到差异。这是家庭作业,所以我不想要一个答案,我想了解其中的差异。算法为here
def file_open(perkList,fileName):
with open(fileName, 'r') as f:
for line in f.readlines():
perkList.append(int(line))
def perkSort(perkList):
for marker in range(len(perkList)):
save = perkList[marker]
i = marker
while i < len(perkList) and perkList[i+1] > save:
perkList[i] = perkList[i-1]
i = i - 1
perkList[i] = save
print("New list",perkList)
def main():
perkList = []
file_open(perkList,'integers')
file_open(perkList,'integers2')
print("initial list",perkList)
perkSort(perkList)
main()
道歉这个问题并不干净。编辑表示赞赏。
答案 0 :(得分:0)
您编写的程序确实实现了插入排序。
让我们举一个例子,看看你的程序会做什么。输入5 8 2 7
第一次迭代后
5 8 2 7
第二次迭代后
2 5 8 7
第三次迭代后
2 5 7 8
但是链接中给出的算法的工作方式不同。它需要最大的元素并将其放在最后。对于我们的例子
第一次迭代后
5 2 7 8
第二次迭代后
2 5 7 8
答案 1 :(得分:0)
您的作业中提到的Perksort算法基本上是 冒泡排序 算法。您实施的是 Inserion Sort 算法。区别如下:
它的工作原理是将输入列表中的元素插入到已排序的列表中的正确位置。也就是说,它一次构建一个项目的排序数组。
## Unsorted List ##
7 6 1 3 2
# First Pass
7 6 1 3 2
# Second Pass
6 7 1 3 2
# Third Pass
1 6 7 3 2
# Fourth Pass
1 3 6 7 2
# Fifth Pass
1 2 3 6 7
请注意,在 i 迭代之后,第一个 i 元素被排序。
您在 ith 步骤中获得了最多 i 次迭代。
伪码:
for i ← 1 to length(A)
j ← i
while j > 0 and A[j-1] > A[j]
swap A[j] and A[j-1]
j ← j - 1
这是你在python实现中所做的。
一些复杂性分析:
Worst case performance О(n2)
Best case performance O(n)
Average case performance О(n2)
Worst case space complexity О(n) total, O(1) auxiliary
这是 PerkSort算法,用于在作业中实现。
它的工作原理是反复扫描要排序的列表,同时比较相邻的元素对,然后根据需要进行交换。
## Unsorted List ##
7 6 1 3 2
# First Pass
6 1 3 2 7
# Second Pass
1 3 2 6 7
# Third Pass
1 2 3 6 7
# Fourth Pass
1 2 3 6 7
# No Fifth Pass as there were no swaps in Fourth Pass
请注意,在 i 迭代之后,最后的 i 元素是最大的,并且是有序的。
您在 ith 步骤中获得了最大的 n-i-1 次迭代。
我不在这里给psuedocode,因为这是你的家庭作业。
提示:您将向前移动标记,以便将元素向上移动,就像冒泡一样
一些复杂性分析:
Worst case performance О(n2)
Best case performance O(n)
Average case performance О(n2)
Worst case space complexity О(n) total, O(1) auxiliary
即使两种算法平均具有相同的时间和空间复杂性,实际上插入排序比冒泡排序更好。这是因为平均冒泡排序需要比插入排序更多的交换。插入排序在具有少量inversions的列表中表现更好。