对归并排序的简单修改就可以解决问题。归并排序是 O(n log n)。它也是稳定的,这意味着具有相同键的项目将保持相同的相对顺序。这里唯一的区别是您要消除重复项。对代码的唯一更改是项目的比较和复制。例如,标准归并排序的内部循环如下所示:
while (leftIndex < leftMax && rightIndex < rightMax)
{
if (a[leftIndex] <= a[rightIndex])
{
output[outputIndex] = a[leftIndex];
++leftIndex;
}
else
{
output[outputIndex] = a[rightIndex];
++rightIndex;
}
}
您将修改代码,以免复制相等的项目:
while (leftIndex < leftMax && rightIndex < rightMax)
{
if (a[leftIndex] < a[rightIndex])
{
output[outputIndex] = a[leftIndex];
++leftIndex;
}
else if (a[leftIndex] > a[rightIndex])
{
output[outputIndex] = a[rightIndex];
++rightIndex;
}
else
{
// items are equal.
// increment the right, but don't copy anything
++rightIndex;
}
}
您也可以使用标准合并排序来执行此操作,然后对已排序的数组进行最后一次传递以删除重复项。
您可以将 Quicksort 与自定义比较功能一起使用,该功能可以比较电话号码和日期/时间。然后对排序后的数组进行最后一次传递以删除重复项。
快速排序和合并排序都被认为是分而治之的算法。