我在我的程序中使用qsort()
对数组进行排序,以便我可以使用bsearch()
来查找某个元素。
我让qsort()
正确地为数组工作,因为我的数组在排序时没有填满它返回类似于此
a[0] = value,
a[1] = value,
a[2] = NULL,
a[3] = NULL,
排序后
a[0] = NULL,
a[1] = NULL,
a[2] = value,
a[3] = value,
有没有办法在排序之前撤消排序以恢复?
这是qsort()
代码
`qsort(a,size_a,sizeof(*value),(int(*)(const void*,const void*)) strcmp);`
用于比较我刚才使用strcmp
的值,因为所有值都是字符串。
答案 0 :(得分:7)
没有。有多个原始数组将排序到相同的输出数组。你怎么知道选择哪一个?
如果你想要原版,那么你需要制作一份副本,然后对其进行排序。 (或者,创建一个指向原始元素的指针数组,然后对其进行排序。)
答案 1 :(得分:2)
虽然奥利的答案是正确的,但还是有一种解决方法。如果要排序的对象中有足够的未使用空间(例如,如果使用struct
类型添加size_t
类型的额外字段),则可以在排序之前将原始索引存储在数组中,然后使用此索引字段作为排序键执行第二次排序操作,以将它们按原始顺序放回。
答案 2 :(得分:1)
排序通常不是可逆变换。除了Burrows-Wheeler Transform,排序输入,或只有一个输入 - 我不认为排序是可逆的。