专注于可能将输入作为整数流接受的问题,一种解决方案是修改插入排序...
创建一个列表列表(此处命名为countlist),最初为空。每次接受一个新值时,遍历countlist 中的每个列表,查找该值。如果您在countlist[i] 中找到值,请从其当前列表中删除该值并将其插入countlist[i+1],如有必要,将新列表添加到countlist。如果找不到值,请将值插入到countlist[1]。
迭代降序而不是升序的目的是,如果您在countlist[i-1] 中找到该值,则它允许您维护一个指向countlist[i] 中插入值的位置的指针。如果您不需要对共享相同计数的值进行子排序,则可以跳过此指针并迭代升序。
我相信这个算法总体上是 O(n2)。处理每个新值的时间为 O(n),并且结果会随您进行排序。在任何时候,您都可以通过以降序遍历countlist 并打印每个列表来打印正确的顺序(到目前为止)。
示例运行,使用问题中的示例...
input: 7, 4, 2, 4, 9, 6, 5, 6, 2, 0, 2, 1
After accepting 7:
countlist[1] = 7
After accepting 4:
countlist[1] = 4, 7
After accepting 2:
countlist[1] = 2, 4, 7
After accepting 4:
countlist[1] = 2, 7
countlist[2] = 4
After accepting 9:
countlist[1] = 2, 7, 9
countlist[2] = 4
After accepting 6:
countlist[1] = 2, 6, 7, 9
countlist[2] = 4
After accepting 5:
countlist[1] = 2, 5, 6, 7, 9
countlist[2] = 4
After accepting 6:
countlist[1] = 2, 5, 7, 9
countlist[2] = 4, 6
After accepting 2:
countlist[1] = 5, 7, 9
countlist[2] = 2, 4, 6
After accepting 0:
countlist[1] = 0, 5, 7, 9
countlist[2] = 2, 4, 6
After accepting 2:
countlist[1] = 0, 5, 7, 9
countlist[2] = 4, 6
countlist[3] = 2
After accepting 1:
countlist[1] = 0, 1, 5, 7, 9
countlist[2] = 4, 6
countlist[3] = 2