C中的重复删除排序字符串算法

时间:2013-12-04 10:20:24

标签: c algorithm sorting

你好我想知道是否有类似于qsort的排序算法也会删除重复的索引。

这是问题。

这是输入:

array[0]->["astr"]
array[1]->["zstr"]
array[2]->["cstr"]
array[3]->["astr"]
array[4]->["zstr"]

这是我的排序算法:

int compare(const void *u, const void *h) {
    const char **iu = (const char **) u;
    const char **ih = (const char **) h;
    return strcasecmp(*iu, *ih);
}

...
qsort(array, n, sizeof (char *), compare);

输出是:

array[0]->["astr"]
array[1]->["astr"]
array[2]->["cstr"]
array[3]->["zstr"]
array[4]->["zstr"]

我需要的是:

array[0]->["astr"]
array[1]->["cstr"]
array[2]->["zstr"]

我可以尝试读取整个数组for循环并测试每个索引,如果它与下一个相同然后重新分配新数组,我只存储唯一的单词,但这很慢,所以我需要找到排序算法,会比我更快地为我做这件事。

3 个答案:

答案 0 :(得分:3)

您可能无法轻易地调整qsort,因为删除数组元素可能会使递归中的其他位置的枢轴点无效。

我会使用插入排序算法:这将很容易适应;你甚至可以免费删除重复项。

答案 1 :(得分:3)

您可以在排序后删除重复项。这样做的好处是不需要额外的存储空间并且是O(n),因此总复杂度仍然是排序的O(nlogn)。

int unique (int n, const char **a) {
   int dst = 0, i;
   for (i = 1; i < n; ++i) {
       if (strcmp (a[dst], a[i]) != 0)
           a[++dst] = a[i];
   }

   return dst + 1;
}

答案 2 :(得分:1)

您总是可以通过简单的复制来获取已排序的重复数组并创建新的已排序非重复数据,只需在末尾调用realloc即可删除未使用的索引。